我有一个简单的SQL语法用于插入表。我正在使用Postgresql 8.4并且已经将数据库编码设置为UTF8,将POSIX设置为Collation和Character类型。
如果我在pgadmin3下运行它,查询就可以了,但如果我在PHP中执行,则会出错。
"Internal Server Error: SQLSTATE[22021]:
Character not in repertoire: 7 ERROR:
invalid byte sequence for encoding \"UTF8\": 0xd85b\nHINT:
This error can also happen if the byte sequence does not match the encoding expected by the server,
which is controlled by \"client_encoding\"
所以我试图从PHP(PDO)设置NAMES和client_encoding,但仍然有同样的问题
$instance->exec("SET client_encoding = 'UTF8';");
$instance->exec("SET NAMES 'UTF8';");
pg_set_client_encoding($link, "UNICODE");
如果我使用的是本机postgresql驱动程序pg_pconnect
,我的工作正常,但目前我正在使用PDO作为驱动程序。
我也已设置mb_internal_encoding('UTF-8');
还有其他方法可以解决这个问题吗?
此错误仅在我尝试插入非阿拉伯语或日语单词
等非ascii字词时出现答案 0 :(得分:7)
尝试使用utf8_encode()编码为utf-8。
$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)";
pg_exec($connection, utf8_encode($query ));
答案 1 :(得分:1)
回答一篇较旧的帖子,但我刚刚遇到类似的情况,在CSV导入过程中,我注意到了错误:
invalid byte sequence for encoding "UTF 8": 0x95 in ....
我通过使用以下方法将PHP中的编码从Windows-1252转换为UTF-8来修复错误:
mb_convert_encoding($fieldValue,'UTF-8','Windows-1252')
$query = "INSERT INTO student
(id, firstName, lastName, age)
VALUES
(1, '".mb_convert_encoding($firstName,'UTF-8','Windows-1252')."',
'".mb_convert_encoding($lastName,'UTF-8','Windows-1252')."', 23)";
希望这会对某人有所帮助。
答案 2 :(得分:-1)
我将无法提交正确的unicode SQL查询( quercus 用于 java 改变unicode的糟糕工作,并且所有类似“SET NAMES'UTF8'; “没有用,”我从 Base64转换:
解决了这个问题$name_enc = base64_encode($name);
$res = $db->prepare(
'INSERT INTO "MyTable"("ID", "Name") VALUES
( nextval(\'gen_addresses\'),
convert_from(decode(?, \'base64\'), \'UTF8\'));'
)->execute(array($name_enc));