我们正在使用安装在 Cent OS 上的 Symfony 和 Doctrine 开发 REST API。 通过我们的网站 (charset=UTF8) 使用 REST API 时,一切正常。
但当外部用户使用 API 并尝试发送一些重音字符(à、î、...)时,其中一些用户会遇到以下错误:
[2014-07-11 09:53:22] request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\DBALException: "执行 'INSERT INTO xyz.abc (id, creation_date, ip, type, message) 时发生异常) VALUES (?, ?, ?, ?, ?)' with params [19, null, "173.0.81.1", "VALID_TRANSACTION", "\x74\x78\x6e\x5f..."]: SQLSTATE[22021] : 字符不在轨道中:7 错误:编码“UTF8”的字节序列无效:0xe1 0x6e 0x3b“
/var/www/xyz/symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:91, PDOException: SQLSTATE[22021]: Character not in repertoire: 7 ERROR: 编码字节序列无效\"UTF8\": 0xe1 0x6e 0x3b 在/var/www/xyz/symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php:165)"} []
我们的 PostgreSQL 数据库 (psql -l) 配置如下:
- 姓名:XYZ
- 编码:UTF8
- 整理:en_US.UTF-8
- 查尔。类型:en_US.UTF-8
我在日志中看到了这些错误,但我自己无法重现。 我尝试使用 API with Content-Type: application/json; charset=... 但它也有效。
我真的不明白为什么会出现这个错误。还有为什么在错误中,内容被编码 (\x74\x78\x6e\x5f...)。如果我尝试连接到 pgsql 并插入重音字符(未编码),它也可以工作...
有人知道如何解决这个问题吗?
谢谢!
最佳答案
很可能有人试图使用非 utf8 有效消息
调用您的 REST API。
Doctrine 的 BDALException
使用 json_encode
打印绑定(bind)参数,但如果失败(因为它不是 utf-8),它将 print it hex .
PostgreSQL 还提示它包含无效的 utf8 字符序列。
message starts with txn_
(这似乎是有效的)但后来有 "\xe1\x6e\x3b"
在里面,这是无效的。这可能是您的 API 使用不当。
关于postgresql - Symfony/学说 : Invalid byte sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24695748/