我确定我在某种程度上错过了一些愚蠢的事情。我正在使用doctrine设置数据库,因为我有很多遗留数据,我从外部数据库导入数据。外部数据库有latin1字符集,所以当我访问它时,我调用
SET CHARACTER SET utf8
确保我将从此服务器收到utf8字符。运行
SHOW VARIABLES LIKE 'character_set%'
告诉我客户端字符集确实是utf8,服务器端字符集仍然应该是latin1。现在回到我的外部数据库,那个是由学说管理的。使用相同的查询向我显示所有字符集确实是utf8。当我想要创建一个新条目时,我要输入的值之一是Juliën,字符ë会导致错误。
102085 - An exception occurred while executing 'INSERT INTO Person (id, name_last, name_first, name_infix, gender, username, password_salt, password_hash, password_expires, account_disabled) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [<id>, "<name_first>", "\x4a\x75\x6c\x69\xe3\xab\x6e", "", "<gender>", "<email>", "<long hash>", "<long hash>", null, 1]:
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE3\xABn' for column 'name_first' at row 1
现在其他像ð这样的utf8字符确实有效。有没有人有任何线索?
从数据库中检索时的实际字符串值如果与带有===的字符串“Juliën”相比,则返回true,即使我从其他数据库中丢弃数据并只是手动将字符串键入代码文件中得到同样的错误。
感谢您的帮助:)
编辑:忘了分享,整个数据库都设置了charset utf8和默认排序规则(这是utf8_unicode_ci iirc)。
编辑:进一步测试后,我可以通过从当前使用的entityManager获取连接手动查询来输入整行。所以这个问题似乎与Doctrine有关。
答案 0 :(得分:0)
问题可能是由SQL插入语句参数引起的吗?看起来好像是在插入&lt; first_name&gt;预期姓氏的位置。这是故意的吗?
答案 1 :(得分:0)
任何地方都没有MySQL的Doctrine问题,只是提醒你不要在utf编码的字符上调用strtolower ......