utf8mb4 in MySQL Workbench and JDBC
我一直在使用UTF-8编码的MySQL数据库,现在它需要能够存储4字节的表情符号,因此我决定将utf8编码更改为utf8mb4:
1 2 3 4 | 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"字符集服务器= utf8"更改为"字符集服务器= utf8mb4"
这些步骤之后,我能够存储表情符号(为??),但是仅当在MySQL控制台中执行SQL查询时:当我尝试从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}
但没有运气,我得到了同样的"不正确的字符串值:' xF0 x9F x92 xA2'"错误。
也尝试过
${bdpath:3306/bstdb?useUnicode=true&characterEncoding=utf8mb4&}
但它拒绝建立连接。
关于如何配置MySQL工作台和/或JDBC / Wildfly的任何想法吗?
MySQL版本是5.7.18
MySQL WorkBench版本为6.0.8
JDBC驱动程序版本为5.1.34
谢谢!
终于,它起作用了。这是存储过程的问题,迁移后仍然是utf8而不是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
在mysql中执行:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
删除涉及的过程,然后重新创建它们。它们将位于utf8mb4中。
可以检查
SHOW PROCEDURE STATUS where name LIKE 'procedure_name';
将
1 | jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8 |
还要检查您是否已配置MySQL与
1 2 3 4 5 6 7 8 9 10 | [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 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.
您可以在这里查看文档
您可以按照MySQL可用的文档来解决问题。这是您可以参考的MySQL文档。
基本上,可以按照上述文档更改
1 | jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8 |
进行字符集和编码更改后,请不要忘记重新启动MySQL服务。