java - Java MySql 连接器版本之间的默认 CHARACTER_SET 和 COLLATION_CONNECTION 更改了吗?
问题描述
我们使用的是 MySql 5.7 版,我们所有的表\数据库都使用 utf8_unicode_ci。在尝试将我们的 Java 连接器从 5.1.38 升级到最新 (8.0.17) 时,我们遇到了以下异常:
java.sql.SQLException: Illegal mix of collations (utf8_bin,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
比较两个连接器之间的会话变量,我们注意到了两者CHARACHTER_SET
,并且COLLATION_CONNECTION
在版本之间发生了utf8_bin
变化utf8mb4_general_ci
。
我知道我们可以添加到连接字符串connectionCollation=utf8_bin
,但这不是超级安全,有没有办法强制 MySql 服务器根据数据库的默认排序规则\字符集设置默认排序规则?
解决方案
您应该阅读https://dev.mysql.com/doc/refman/8.0/en/charset-connection.html,它解释了有关客户端和服务器字符集的所有内容。
据我所知,客户端或连接字符集无法隐式使用数据库字符集。最接近的情况如下,它仍然需要客户端运行一个语句:
SET CHARACTER SET utf8mb4;
这隐式地将character_set_connection
and设置collation_connection
为当前默认数据库的。
我不知道你为什么说将排序规则添加到连接字符串是不安全的。这不就是为了这个吗?
推荐阅读
- css - 如何让 Animate.css 与 Tailwind 的 @responsive 指令一起使用?
- asp.net-core - .net 核心并行电子邮件发送
- python - 如果删除不需要的 Python3 核心模块,未来的第 3 方包可能会出现什么问题
- python - 成功尝试后如何使此循环成功?
- python - 尝试使用 RTM API 连接到 Slack 时出现“RTM 连接失败”错误
- reactjs - React-Grid-Layout 元素处理跳转,如果在 react app 中的应用根目录中有其他元素
- javascript - 将html标签从控制器传递给angularjs变量
- mysql - 编写查询以查找每个员工第一份工作的最后一天
- xml - xslt:基于当前节点的以下兄弟节点的条件更新
- python - 在 django 中用逗号获取 id