哪个MySQL变量设置了本地变量的默认排序规则?

时间:2019-12-07 14:37:55

标签: mysql collation

说我有这个存储过程:

CREATE PROCEDURE x(
)
LANGUAGE SQL
DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY INVOKER
COMMENT ''
BEGIN

DECLARE test VARCHAR(50) CHARACTER SET 'utf8mb4';

-- ...

END

定义局部变量test的排序规则的mysql服务器变量是什么?

当前是(感谢mysql 8.0 ...)utf8mb4_0900_ai_ci,因此我在稍后的代码中会产生一个“不错的” Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

设置

DECLARE test VARCHAR(50) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

消除了Illegal collation错误,所以我确定是该变量具有错误的0900排序规则。

但是,不,我不会在所有过程中重写所有局部变量来设置此显式排序规则。那么如何为服务器全局设置此设置?还是至少我该如何为连接设置?

到目前为止,除以下内容外,我还具有默认的mysql 8配置:

[mysqld]
skip-log-bin
innodb_buffer_pool_size = 4G
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

# character_set_database  = utf8mb4
# collation_database = utf8mb4_general_ci
# character_set_client = utf8mb4
# character_set_connection = utf8mb4
# collation_connection = utf8mb4_general_ci
# character_set_results = utf8mb4

此语句在客户端连接上运行:

SET CHARACTER SET utf8mb4, NAMES utf8mb4, collation_connection = 'utf8mb4_general_ci', lc_messages = 'en_US', time_zone = '+00:00'

注释掉的变量是那些试图启动mysql服务器时抛出unknown variable '...=...'的变量,尽管这些变量是listed in mysql 8 documentation……

1 个答案:

答案 0 :(得分:0)

来自the docs

  

如果不存在CHARACTER SET和COLLATE,则使用在例行创建时有效的数据库字符集和排序规则。为避免服务器使用数据库字符集和排序规则,请为字符数据参数提供显式的CHARACTER SET和COLLATE属性。

最有可能的是,存储过程是在更新配置之前创建的,在这种情况下,您要做的就是删除并重新创建它们,以便它们使用新的默认值。