设置数据库uft8mb4后保留黑钻石和问号

fumotvh3  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(379)

关于mysql数据库和javajdbc连接编码。数据库已转换为utf8mb4和utf8mb4\u unicode\u ci,如图所示这是 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 从jdbc连接。

+--------------------------+--------------------+
|      Variable_name       |       Value        |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

从mysql工作台和直接连接到db的终端上,我可以看到unicode字符 í 正确的十六进制值 c3 ad ```
+------------------------------+
| HEX(location.name) |
+------------------------------+
| C3AD |
+------------------------------+

jdbc连接设置: `useUnicode=true&characterEncoding=UTF-8` 将hikaricp与的配置一起使用 `config.addDataSourceProperty("useUnicode", "true"); config.addDataSourceProperty("characterEncoding", "utf-8"); config.setConnectionInitSql("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");` 使用 `mysql-connector-java:8.0.11` 根据使用jdbc连接查询相关表的结果 `í` 字符返回为 `�` 在 Postman 之内。以及 `?` 返回为 `?` 在 Postman 之内。
根据stackoverflow.com/questions/38363566,这让我相信我在阅读过程中的连接不是utf-8,我该如何检测?
数据库和应用程序已重置为应用设置(如果需要)。
8fsztsew

8fsztsew1#

characterencoding=utf-8与utf8mb4不兼容。使用 character_set_server=utf8mb4 在jdbc url中,或者 config.addDataSourceProperty("character_set_server", "utf8mb4"); . 完全不要使用字符编码。
来自mysql connection/j开发人员指南→ 使用字符集→ 设置字符编码:
…要在connector/j中使用4字节utf-8字符集,请使用 character_set_server=utf8mb4 ,然后离开 characterEncoding 从连接器/j连接串中取出。
就在下面:
警告
为了使用 utf8mb4 对于连接的字符集,服务器必须配置为 character_set_server=utf8mb4 ; 如果不是这样,什么时候 UTF-8 用于 characterEncoding 在连接字符串中,它将Map到mysql字符集名称 utf8 ,这是的别名 utf8mb3 .

jecbmhm3

jecbmhm32#

除了遵循vgr的帮助之外,我还使用了一个普通的printwriter来发送不允许utf-8编码的响应。而不是

PrintWriter out = response.getWriter();
out.println(res);
out.flush();

替换为

response.getOutputStream().write(res.toString().getBytes("UTF-8"));
m0rkklqb

m0rkklqb3#

" í 字符返回为 “是一个不同的问题” ? 返回为 ? "
前者通常发生在 í 未编码为utf-8。注意,在mysql中,utf8mb3和utf8mb4对于该字符和所有其他欧洲字符的正确编码是相同的。修复连接(正如vgr所讨论的)可能不会修复它。只有当浏览器未设置为utf-8(unicode)时,才会出现黑钻石。
“一堆便便”仅适用于utf8mb4,而不是utf8mb3。所以,假设客户正确地拥有hex F09F92A9 ,则连接参数(请参阅vgr)可能是导致问题的原因。
(更多讨论请参见您提供的链接。)

相关问题