关于MySQL数据库和Java JDBC连接编码。数据库已转换为utf8mb4和utf8mb4_unicode_ci,如下所示:这是来自JDBC连接的SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
的结果。
+--------------------------+--------------------+
| 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 |
+--------------------------+--------------------+
从Unicode和直接连接到DB的终端中,我可以看到MySQL字符í
及其正确的十六进制值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
在Postman中,从使用JDBC连接查询相关表的结果中,í
字符被作为�
返回。并且在Postman中作为?
返回。
根据stackoverflow.com/questions/38363566的说法,这让我相信我在阅读过程中的连接不是UTF-8,我如何检测到这一点?
如果需要,数据库和应用程序已重置为应用设置。
发布于 2018-09-30 07:55:18
除了遵循VGR的帮助之外,我还使用了一个普通的PrintWriter来发送响应,这不允许使用UTF8编码。而不是
PrintWriter out = response.getWriter();
out.println(res);
out.flush();
替换为
response.getOutputStream().write(res.toString().getBytes("UTF-8"));
发布于 2018-10-11 11:10:31
"í
character is returned as �
“与”is returned as ?
“是不同的问题。
前一种情况通常发生在í
的字节未编码为UTF-8时。注意,在MySQL中,对于该字符和所有其他欧洲字符的正确编码,utf8mb3和utf8mb4是相同的。修复连接(如VGR所讨论的)可能不会修复它。只有当浏览器未设置为UTF-8 (Unicode)时,才会出现黑色菱形。
“一堆便便”只能在utf8mb4中使用,而不能在utf8mb3中使用。因此,假设客户端正确地具有十六进制F09F92A9
,那么连接参数(参见VGR)可能是导致问题的原因。
(在您提供的链接中有更多讨论。)
https://stackoverflow.com/questions/52573061
复制相似问题