[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 メーリングリストの案内