关于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,我该如何检测?
数据库和应用程序已重置为应用设置(如果需要)。
3条答案
按热度按时间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
.jecbmhm32#
除了遵循vgr的帮助之外,我还使用了一个普通的printwriter来发送不允许utf-8编码的响应。而不是
替换为
m0rkklqb3#
"
í
字符返回为�
“是一个不同的问题”?
返回为?
"前者通常发生在
í
未编码为utf-8。注意,在mysql中,utf8mb3和utf8mb4对于该字符和所有其他欧洲字符的正确编码是相同的。修复连接(正如vgr所讨论的)可能不会修复它。只有当浏览器未设置为utf-8(unicode)时,才会出现黑钻石。“一堆便便”仅适用于utf8mb4,而不是utf8mb3。所以,假设客户正确地拥有hex
F09F92A9
,则连接参数(请参阅vgr)可能是导致问题的原因。(更多讨论请参见您提供的链接。)