我一直在使用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"字符集服务器= 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。
这是一个两步解决方案。
如@ 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';
错过了我的答案中的配置文件部分,这对我来说是一个学习!
您所说的"涉及删除程序"是什么意思?关于第三点,您可以举一个procedure_name是什么的例子吗?得到空结果:(
"涉及的过程"是指通过使用" CREATE PROCEDURE procedure_name等"语句在给定数据库中自定义创建的过程(" procedure_name"是您为该过程指定的名称,如函数名)
将characterEncoding=utf8用于jdbc 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
看这里
使用参数" characterEncoding = utf8mb4"时,根本无法建立连接::" java.sql.SQLException:不支持的字符编码utf8mb4。"
您在此处指定Java编码,因此应使用UTF-8。
不,她不需要utf8编码
@ motagirl2试试我更新的答案
我尝试了@MikeAdamenko,但拒绝连接
香港专业教育学院更新了答案
@MikeAdamenko" characterEncoding = utf8mb4"绝对不起作用。
从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文档。
基本上,可以按照上述文档更改ALTER TABLE脚本,然后可以在连接字符串中使用以下参数使更改生效。
jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
进行字符集和编码更改后,请不要忘记重新启动MySQL服务。
使用" characterEncoding = utf8mb4"参数时,根本无法建立连接:" java.sql.SQLException:不支持的字符编码utf8mb4"。
您在此处指定Java编码,因此应使用UTF-8。
是的,纠正了!
没有。与开始时相同的问题:历史:方法创建时出错:java.sql.SQLException:不正确的字符串值:第1行的srcctxt列的 xF0 x9F x92 xA2:/