说我有这个存储过程:
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……
答案 0 :(得分:0)
来自the docs:
如果不存在CHARACTER SET和COLLATE,则使用在例行创建时有效的数据库字符集和排序规则。为避免服务器使用数据库字符集和排序规则,请为字符数据参数提供显式的CHARACTER SET和COLLATE属性。
最有可能的是,存储过程是在更新配置之前创建的,在这种情况下,您要做的就是删除并重新创建它们,以便它们使用新的默认值。