【问题标题】:PHP MySQL Collation Issue - Joined tablesPHP MySQL排序规则问题 - 连接表
【发布时间】:2018-05-12 15:22:33
【问题描述】:

我正在开发一个可以安装在多台服务器上的项目。我遇到的问题是人们可以将他们的服务器和表格设置为不同的排序规则。在一台服务器上,我收到的错误是

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

【问题讨论】:

    标签: php mysql collation


    【解决方案1】:

    最好在所有表和连接中保持一致 -- 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

    【讨论】:

    • 延迟了,但感谢您的回复。由于我的脚本是第 3 方程序的插件,我无法真正控制某些表格。我最终所做的是修改我的脚本以创建与其他 2 个表匹配的表。这意味着在其服务器上安装了它的任何人都应该避免任何排序规则错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2020-02-13
    • 2022-08-08
    • 2011-11-14
    • 2014-05-20
    • 2013-01-09
    相关资源
    最近更新 更多