1

PHP PDO_Informix ドライバー v1.2.7 を使用しており、Informix クライアントのバージョンは 3.70 です。Latin1 データベース (Informix サーバーは 9.21) に対してクエリを実行する UTF-8 のコードがいくつかあります。

問題は、ドライバーが戻り文字列の一部の値を切り刻んでいることです。特殊文字が2倍にカウントされるようなものです。列 'name' の型が varchar(2) で、name の値が 'áa' の場合、照会時に返される値は 'áa' ではなく 'á' です。列のサイズを varchar(3) に変更すると、結果は正しいです。以下に、バグを再現するための短いスクリプトを添付します。エンコーディング設定を確認できるように、DSN を含めました。

テスト スクリプト:

$dsn = "informix:database=base;server=ol_server;host=192.168.123.123;client_locale=en_us.utf8;db_locale=en_us.819;service=1526;protocol=olsoctcp;EnableScrollableCursors=1";
$db = new \PDO($dsn, 'user', 'pass');
$db->exec("CREATE TABLE ticket82 ( name VARCHAR(2) );");
$db->exec("INSERT INTO ticket82 VALUES ('aa');");

$statement = $db->query("select name from ticket82;");
$value = $statement->fetchAll(\PDO::FETCH_ASSOC);
echo "expected 'aa' got '{$value[0]['NAME']}'\n";

$db->exec("update ticket82 set name='áa';");
$statement = $db->query("select name from ticket82;");
$value = $statement->fetchAll(\PDO::FETCH_ASSOC);
echo "expected 'áa' got '{$value[0]['NAME']}'\n";

$db->exec("ALTER TABLE ticket82 MODIFY (name varchar(3));");
$statement = $db->query("select name from ticket82;");
$value = $statement->fetchAll(\PDO::FETCH_ASSOC);
echo "expected 'áa' got '{$value[0]['NAME']}'\n";

$db->exec("DROP TABLE ticket82;");

期待される結果:

expected 'aa' got 'aa'
expected 'áa' got 'áa'
expected 'áa' got 'áa'

実結果:

expected 'aa' got 'aa'
expected 'áa' got 'á'
expected 'áa' got 'áa'

何か案は?

4

1 に答える 1