我使用的是 PHP PDO_Informix 驱动程序 v1.2.7,Informix 客户端版本是 3.70。我有一些 UTF-8 代码可以查询 Latin1 数据库(Informix 服务器是 9.21)。
问题是驱动程序正在砍掉返回字符串的一些值。这就像特殊字符计数加倍。如果列 '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'
有任何想法吗?