[pgsql-jp: 34746] Re: charのlength_ _について

tomson tomson_lpcjp @ yahoo.co.jp
2005年 1月 28日 (金) 15:21:46 JST


こんにちは。tomsonと申します。

> create table test (
>   a char(10)
> )
> の定義のテーブルで
> たとえば、aの値が → "あいうえ"
> で、select length(a) from test;
> すると、結果は6となります。
> select octet_length(a) from test;
> にするとちゃんと10が戻ってきます。

わたしの環境ではこうでした。

     a      | length | octet_length
------------+--------+--------------
 あいうえ   |     10 |           10
 abcde      |     10 |           10
(2 rows)

postgre=$select version();

PostgreSQL 7.4.5 on i386-portbld-freebsd5.3, compiled by GCC cc (GCC) 3.4.2 
[FreeBSD] 20040728
(1 row)

>
> ishida=# select a, length(a), octet_length(a) from test;
>        a        | length | octet_length
> ----------------+--------+--------------
>  あいうえ       |      4 |           14
>  abcde          |      5 |           10
> (2 行)
>
> ishida=# select version();
>                                                  version
>
> ---------------------------------------------------------------------------
>------------------------------ PostgreSQL 8.0.0 on i686-pc-linux-gnu,
> compiled by GCC gcc (GCC) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
> (1 行)
>
> # octet_lengthが14というのは何でだろう。

以下引用。
<!--
シフトJISは言うまでもなくISO 2022 非準拠です。
 マイクロソフト社など数社が開発したシフト JIS は、JIS X 0201・JIS X 0208という2つの符号化文字集合を対象としたエンコーディング法
で、エスケープシーケンスを使用せずに2バイトコード文字を混在させることができます。しかし、これらの文字を構成している2バイトのうち第2バイトのなかに 
ASCII 文字と重複するものが存在します。また、シフト JIS は、JIS X 0212 で定義されている「補助漢字」をサポートしていません。これは、単
純にこれらの文字を収められるだけのコード空間が無いためです。
-->

つまり、M$漢字コードは、マルチバイトのくせにマルチバイトではない、という変なコードなのです!
ぎちぎちに詰めてある、らしいです。理由は単にコード空間がない、という理由で。

あいうえ=単純に8バイト、1バイト4ビットとして全体で32ビット(8 8 8 8 で32)
それぞれ1ビット欠損 32-4=28
それを2で割ると 14

というのはどうでしょうか(自信ねえけど)



pgsql-jp メーリングリストの案内