MySQL Workbench 和 JDBC 中的 utf8mb4
utf8mb4 in MySQL Workbench and JDBC
我一直在使用 UTF-8 编码的 MySQL 数据库,现在需要能够存储 4 字节的表情符号,所以我决定从 utf8 编码更改为 utf8mb4:
ALTER DATABASE bstdb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE HISTORY CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE HISTORY CHANGE SOURCE_CONTEXT SOURCE_CONTEXT VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
并将mysql.conf.d"character-set-server = utf8"更改为"character-set-server = utf8mb4"
完成这些步骤后,我可以存储表情符号(如 ),但仅当 SQL 查询在 MySQL 控制台中执行时:当我尝试从 MySQL Workbench 或来自 Wildfly webapp,我收到此错误:
Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1
我假设我需要更改客户端连接到数据库的方式,但我不知道如何更改。我读过一些关于在 JDBC 中使用 "useUnicode=yes" 的内容,但没有用。
${bdpath:3306/bstdb?useUnicode=yes}
编辑:
正如评论中所建议的,我尝试了:
${bdpath:3306/bstdb?characterEncoding=UTF-8}
但运气不好,我遇到了同样的 "Incorrect string value: '\xF0\x9F\x92\xA2'" 错误。
也试过
${bdpath:3306/bstdb?useUnicode=true&characterEncoding=utf8mb4&}
但它拒绝建立连接。
知道如何配置 MySQL workbench and/or JDBC/Wildfly 吗?
MySQL 版本是 5.7.18
MySQL WorkBench 版本为 6.0.8
JDBC驱动版本为5.1.34
谢谢!
对jdbc使用characterEncoding=utf8
url
jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8
还要检查您是否已将 MySQL 配置为与 utf8mb4
一起使用
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
见here
您可以按照 MySQL 的可用文档来解决您的问题。这是MySQL documentation,你可以参考。
基本上,您的 ALTER TABLE
脚本可以根据上述文档进行更改,然后您可以在连接字符串中使用以下参数以使更改生效。
jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
请不要忘记在更改字符集和编码后重新启动您的 MySQL 服务。
终于成功了。这是存储过程的问题,迁移后仍然是 utf8 而不是 utf8mb4。
这是一个两步解决方案。
- 根据@mike-adamenko 的建议设置 my.cnf 具有以下
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
在mysql中执行:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
删除涉及的过程,然后重新创建它们。它们将在 utf8mb4 中。
可以用
检查
SHOW PROCEDURE STATUS where name LIKE 'procedure_name';
从 MySQL Connector/J 5.1.47 开始,
When UTF-8 is used for characterEncoding in the connection string, it maps to the MySQL character set name utf8mb4.
你可以查看文档here
我一直在使用 UTF-8 编码的 MySQL 数据库,现在需要能够存储 4 字节的表情符号,所以我决定从 utf8 编码更改为 utf8mb4:
ALTER DATABASE bstdb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE HISTORY CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE HISTORY CHANGE SOURCE_CONTEXT SOURCE_CONTEXT VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
并将mysql.conf.d"character-set-server = utf8"更改为"character-set-server = utf8mb4"
完成这些步骤后,我可以存储表情符号(如 ),但仅当 SQL 查询在 MySQL 控制台中执行时:当我尝试从 MySQL Workbench 或来自 Wildfly webapp,我收到此错误:
Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1
我假设我需要更改客户端连接到数据库的方式,但我不知道如何更改。我读过一些关于在 JDBC 中使用 "useUnicode=yes" 的内容,但没有用。
${bdpath:3306/bstdb?useUnicode=yes}
编辑: 正如评论中所建议的,我尝试了:
${bdpath:3306/bstdb?characterEncoding=UTF-8}
但运气不好,我遇到了同样的 "Incorrect string value: '\xF0\x9F\x92\xA2'" 错误。
也试过
${bdpath:3306/bstdb?useUnicode=true&characterEncoding=utf8mb4&}
但它拒绝建立连接。
知道如何配置 MySQL workbench and/or JDBC/Wildfly 吗?
MySQL 版本是 5.7.18
MySQL WorkBench 版本为 6.0.8
JDBC驱动版本为5.1.34
谢谢!
对jdbc使用characterEncoding=utf8
url
jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8
还要检查您是否已将 MySQL 配置为与 utf8mb4
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
见here
您可以按照 MySQL 的可用文档来解决您的问题。这是MySQL documentation,你可以参考。
基本上,您的 ALTER TABLE
脚本可以根据上述文档进行更改,然后您可以在连接字符串中使用以下参数以使更改生效。
jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
请不要忘记在更改字符集和编码后重新启动您的 MySQL 服务。
终于成功了。这是存储过程的问题,迁移后仍然是 utf8 而不是 utf8mb4。 这是一个两步解决方案。
- 根据@mike-adamenko 的建议设置 my.cnf 具有以下
[client] default-character-set = utf8mb4
[mysql] default-character-set = utf8mb4
[mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
在mysql中执行:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
删除涉及的过程,然后重新创建它们。它们将在 utf8mb4 中。 可以用
检查
SHOW PROCEDURE STATUS where name LIKE 'procedure_name';
从 MySQL Connector/J 5.1.47 开始,
When UTF-8 is used for characterEncoding in the connection string, it maps to the MySQL character set name utf8mb4.
你可以查看文档here