MySQL排序规则服务器变量用户依赖?

时间:2016-04-12 08:25:56

标签: mysql utf-8 collation

在同一数据库的同一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

因此缺少collat​​ion_connection变量。出于某种原因,init_connect是否可能被忽略/用户特定?

由于未设置collat​​ion_connection,因此发生Illegal mix of collations错误。

2 个答案:

答案 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许可的奇怪行为。