我正在开发一个可以安装在多个服务器上的项目。我遇到的问题是人们可以将他们的服务器和表设置为不同的排序规则。在一台服务器上,我收到的错误是
PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
所以我想我通过在查询中添加COLLATE utf8_general_ci
来修复它。它修复了它,它在我的服务器上工作,但后来有人试图在他们的服务器上运行它并收到
Syntax error or access violation: 1253 COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
我可以对我的查询做些什么来让它“正常工作”而不必担心MySQL服务器配置?查询如下,并将几个表连接在一起。我只包括查询本身而不是整个代码块。这是PDO中的一份准备好的声明。
SELECT t.tid, a.clientid, tt.status, ts.showactive FROM TABLE1 t INNER JOIN TABLE2 a ON t.related_asset = a.id INNER JOIN TABLE3 tt ON tt.tid = t.tid INNER JOIN TABLE4 ts ON ts.title = tt.status WHERE ts.showactive = 1
答案 0 :(得分:0)
最好在所有表和连接中保持一致 - 所有CHARACTER SET
(utf8
vs latin1
}和COLLATION
都是一样的。
在查询中添加COLLATE utf8_general_ci
使其工作 - 但性能下降。如果列具有相同的排序规则(和第二个示例中的字符集),则索引可以提高效率。
没有"只是工作"无需工作。一致性(如上所述)是最好的。否则,将需要多个补丁。
参见"最佳实践"在Trouble with UTF-8 characters; what I see is not what I stored
utf8
在旧版MySQL中没问题;但是你想要表情符号和中文,请改用utf8mb4
。