gpt4 book ai didi

java - 带有 JPA : Illegal mix of collations (utf8mb4_general_ci, IMPLICIT 的 MySQL 和 (utf8_general_ci,COERCIBLE)

转载 作者:可可西里 更新时间:2023-11-01 07:14:44 25 4
gpt4 key购买 nike

我需要能够在我的数据库中存储像 \xF0\x9F\x94\xA5 这样的字符,根据 this post需要 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

郑重声明:我在带有 GlassFish 3.1 的 Web 应用程序中使用 Java Persistency 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 直接放入查询中(如建议的 in this post here )

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

但还是没有。

然后我尝试将排序规则直接放在连接中(在 GlassFish 中我使用的是 connection_pool),因为我 read here

characterEncoding, UTF8mb4

但是 GlassFish 只说 无法分配连接,因为:不支持的字符编码 '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 |
+----------------------+------------------+

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

我该怎么做才能使用 utf8mb4utf-32 或任何其他比简单 UTF-8 更高级的东西?

最佳答案

您不需要在 Java 方面进行任何更改,因为 utf8mb4 在 Java 中只是 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

另一个不改变连接字符串的选项是使用版本 >= 5.1.13 的 jdbc 驱动程序: http://www.opensubscriber.com/message/java@lists.mysql.com/14151747.html

关于java - 带有 JPA : Illegal mix of collations (utf8mb4_general_ci, IMPLICIT 的 MySQL 和 (utf8_general_ci,COERCIBLE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26279029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com