[PHP-users 23550]Re: mb_strimwidthと utf-8

Hiroki Kataoka kataoka @ interwiz.jp
2004年 11月 5日 (金) 19:03:08 JST


片岡です。

Makoto Banba wrote:
> 番場です。

> 7.4.5 ですが、UTF-8 のデータベースに、
> 
> create table t_test (name varchar(10));
> 
> として、
> 
> insert into t_test values ('1234567890'); ... OK
> insert into t_test values ('12345678901'); ... NG
> 
> insert into t_test values ('あいう'); ... OK
> insert into t_test values ('あいうえ'); ... NG
> 
> となります。なので、バイトっぽいと思います。

  7.4.6 on Linuxと8.0.0 beta4 on Windowsで試してみましたが、上記とは異な
る結果(私の予想していた結果)となりました。

(8.0.0 beta4の例)

※Windows XPのコンソール上でテストしましたのでクライアントエンコーディン
グはSJISにしてます。7.4.6 on LinuxでのテストではEUC_JPを指定しましたが、
それ以外は下記画面と同じ結果でした。

kataoka=# set client_encoding to 'SJIS';
SET
kataoka=# show server_encoding;
 server_encoding
-----------------
 UNICODE
(1 row)

kataoka=# show client_encoding;
 client_encoding
-----------------
 SJIS
(1 row)

kataoka=# create table t_test(name varchar(10));
CREATE TABLE
kataoka=# insert into t_test values ('あいう');
INSERT 17385 1
kataoka=# insert into t_test values ('あいうえ');
INSERT 17386 1
kataoka=# insert into t_test values ('あいうえおかきくけこ');
INSERT 17387 1
kataoka=# insert into t_test values ('あいうえおかきくけこさ');
ERROR:  value too long for type character varying(10)
kataoka=# select * from t_test;
         name
----------------------
 あいう
 あいうえ
 あいうえおかきくけこ
(3 rows)

kataoka=# select name, octet_length(name), length(name) from t_test;
         name         | octet_length | length
----------------------+--------------+--------
 あいう               |            9 |      3
 あいうえ             |           12 |      4
 あいうえおかきくけこ |           30 |     10
(5 rows)

> 片岡様のおっしゃる、文字単位とはキャラクタセットの最大のバイト数の文字の
> 数のことだと思いましたが、そうではないのでしょうか?

  ほぼそのつもりで説明しました(正確には「最大バイト数の文字数」ではなく
て個々の文字を正しく評価した上での「文字数」ですが)。

  念のため確認ですが、データベースがUNICODE(UTF-8)ではないということは
ありませんか?  あるいはクライアントエンコーディングが間違っているとか。

kataoka=# \l
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+----------
 kataoka   | kataoka  | UNICODE
 template0 | postgres | UNICODE
 template1 | postgres | UNICODE
(3 rows)

-- 
Hiroki Kataoka <kataoka @ interwiz.jp>


PHP-users メーリングリストの案内