MySQL 与 JPA:排序规则(utf8mb4_general_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合

2024-01-10

我需要能够存储像这样的字符\xF0\x9F\x94\xA5在我的数据库中,根据这个帖子 https://stackoverflow.com/a/13754976/896249 need UTF8mb4编码。

所以我设置了我的数据库

CREATE DATABASE `myDB` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

并在MySQL shell中验证是否有效:

SHOW FULL COLUMNS FROM myTable;

+---------+------------------+--------------------+----
| Field   | Type             | Collation          | ...
+---------+------------------+--------------------+-----
| id      | int(10) unsigned | NULL               | ...   
| myColumn| text             | utf8mb4_general_ci | ...
+---------+------------------+--------------------+-----

到目前为止,一切都很好。

运行我的程序后,我得到了这个例外:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
Error Code: 1267

作为记录:我在 Web 应用程序中使用 GlassFish 3.1 的 Java Persistence API (JPA)。这Exception执行命名查询时抛出:

@NamedQuery(name = "myTable.findByMyColumn", query = "SELECT c FROM myTable c WHERE c.myColumn LIKE :myColumn")

然而,似乎只有当查询的字符串实际上包含那些奇怪的表情符号字符时才会发生错误(\xF0\x9F\x94\xA5)

Call: SELECT id, myColumn FROM myDB.myTable WHERE myColumn LIKE ?
bind => [Something something Lorem Ipsum ????????]  

所以我想,某个地方可能仍然是一个utf8_general_ci设置并尝试将COLLATION直接进入查询(按照建议在这篇文章中 https://stackoverflow.com/a/183624/896249)

@NamedQuery(name = "myTable.findByMyColumn", query = "SELECT c COLLATE utf8mb4_general_ci FROM myTable c WHERE c.myColumn LIKE :myColumn")

但还是什么都没有。

然后我尝试将排序规则直接放入连接中(在 GlassFish 中我使用的是连接池) as I 在这里读 https://stackoverflow.com/a/20546571/896249

characterEncoding, UTF8mb4

但 GlassFish 只说Connection could not be allocated because: Unsupported character encoding 'UTF8mb4'

我做的最后一件事是检查数据库系统(我正在使用 MariaDB)

show variables WHERE variable_name like "col%";
+----------------------+------------------+
| Variable_name        | Value            |
+----------------------+------------------+
| collation_connection | utf8_general_ci  |
| collation_database   | utf32_general_ci |
| collation_server     | utf8_general_ci  |
+----------------------+------------------+

现在我完全迷失了......

我可以做什么来使用utf8mb4 or utf-32或者其他比简单的 UTF-8 更高级的东西?


您不需要在 Java 端进行任何更改,因为utf8mb4只是UTF-8在爪哇。

相反,正如您在这里看到的:

show variables WHERE variable_name like "col%";
+----------------------+------------------+
| Variable_name        | Value            |
+----------------------+------------------+
| collation_connection | utf8_general_ci  |
| collation_database   | utf32_general_ci |
| collation_server     | utf8_general_ci  |
+----------------------+------------------+

您的连接设置仍然是utf8_general_ci;要在连接级别设置它,一种选择是执行(特定于 mysql)查询:

SET NAMES='utf8mb4'

在尝试使用 utf8mb4 排序规则之前;或者,通常对于 mysql 服务器,在/etc/my.cnf:

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

不更改连接字符串的另一个选项是使用 jdbc 驱动程序版本 >= 5.1.13:http://www.opensubscriber.com/message/[电子邮件受保护]/14151747.html http://www.opensubscriber.com/message/java@lists.mysql.com/14151747.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 与 JPA:排序规则(utf8mb4_general_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合 的相关文章

随机推荐