[pgsql-jp: 34745] Re: charのlength について

ISHIDA Akio iakio @ mono-space.net
2005年 1月 28日 (金) 14:13:29 JST


こんにちは。石田@苫小牧市です。

lee wrote:
> LEEと申します。
> はじめて投稿します。
> 
> 
> CHAR型DATATYPEフィールドにマルチバイトの
> 文字列が入ったときのlengthの値ですが、、、
> 
> create table test (
>   a char(10)
> )
> の定義のテーブルで
> たとえば、aの値が → "あいうえ"
> で、select length(a) from test;
> すると、結果は6となります。
> select octet_length(a) from test;
> にするとちゃんと10が戻ってきます。
> 
> 
> 
> しかし、aの値を → "abcde" にして
> select length(a) from test;
> すると、結果は10となります。
> 
> char型は固定長なので、戻り値はスペース付きで戻ってきたら
> lengthの値は10になりそうな気がしますが、、
> 
> 英文字と、マルチバイトにそれぞれlength関数をかけた時
> なぜこんな結果が出てしまうのでしょうか?

手元の環境で実行してみましたが、再現しませんでした。
お使いのバージョンはいくつでしょう?

ishida=# create table test (a char(10));
CREATE TABLE
ishida=# insert into test values ('あいうえ');
INSERT 1045640 1
ishida=# insert into test values ('abcde');
INSERT 1045641 1
ishida=# select a, length(a), octet_length(a) from test;
     a      | length | octet_length
------------+--------+--------------
 あいうえ   |     10 |           10
 abcde      |     10 |           10
(2 行)

bishida=# select version();
                                                 version

---------------------------------------------------------------------------------------------------------
 PostgreSQL 7.4.6 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.3
20040412 (Red Hat Linux 3.3.3-7)
(1 行)


8.0.0からは
char(n)型のlength()は後続のスペースを含まない長さを返すそうです。

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というのは何でだろう。

-- 
ISHIDA Akio <iakio @ mono-space.net / ishida @ cycleof5th.com>



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