在同一数据库的同一MySQL服务器上与同一客户端(Sequel Pro)连接不同的SQL用户会导致不同的排序规则服务器变量。
在my.cnf中,我包括以下内容:
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci, NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
与用户A连接会导致:
collation_connection = utf8_unicode_ci
collation_database = utf8_unicode_ci
collation_server = utf8_unicode_ci
init_connect = SET collation_connection = utf8_unicode_ci, NAMES utf8
与用户B连接会产生:
collation_database = utf8_unicode_ci
collation_server = utf8_unicode_ci
init_connect = SET collation_connection = utf8_unicode_ci, NAMES utf8
因此缺少collation_connection变量。出于某种原因,init_connect是否可能被忽略/用户特定?
由于未设置collation_connection,因此发生Illegal mix of collations
错误。
答案 0 :(得分:1)
请注意,当具有init_connect
权限的用户登录时,SUPER
不会运行。这是一项安全功能,as documented:
对于具有SUPER权限的用户,不会执行init_connect的内容。这样做是为了使init_connect的错误值不会阻止所有客户端连接。
这是为了防止你自己完全锁定数据库:
例如,该值可能包含语法错误的语句,从而导致客户端连接失败。对于具有SUPER权限的用户,不执行init_connect使其能够打开连接并修复init_connect值。
因此,这些用户的预期行为是在连接时不设置此变量。
答案 1 :(得分:1)
可能的原因:init_connect
字符串似乎是错误的。尝试:
init_connect='SET collation_connection = utf8_unicode_ci; SET NAMES utf8;'
然后重启mysql服务。
这并不能解释SUPER许可的奇怪行为。