【问题标题】:Black diamonds and question marks persisting after setting database uft8mb4设置数据库 uft8mb4 后黑色菱形和问号持续存在
【发布时间】:2019-03-05 11:56:59
【问题描述】:

关于 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 |
+--------------------------+--------------------+

从 MySQL Workbench 和直接连接到数据库的终端,我可以看到 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,我将如何检测到这一点?

如果需要,数据库和应用程序已重置以应用设置。

【问题讨论】:

    标签: java mysql jdbc payara utf8mb4


    【解决方案1】:

    characterEncoding=utf-8 与 utf8mb4 不兼容。在 JDBC URL 中使用 character_set_server=utf8mb4config.addDataSourceProperty("character_set_server", "utf8mb4");。根本不要使用字符编码。

    来自 MySQL Connection/J 开发者指南 → 使用字符集 → Setting the Character Encoding

    ...要在 Connector/J 中使用 4 字节 UTF-8 字符集,将 MySQL 服务器配置为 character_set_server=utf8mb4,并将 characterEncoding 保留在 Connector/J 连接字符串之外。

    在它的正下方:

    警告

    为了使用utf8mb4 字符集进行连接,服务器必须配置character_set_server=utf8mb4;如果不是这样,当UTF-8 用于连接字符串中的characterEncoding 时,它将映射到MySQL 字符集名称utf8,这是utf8mb3 的别名。

    【讨论】:

      【解决方案2】:

      除了听从 VGR 的帮助外,我还使用普通的 PrintWriter 来发送不允许 UTF-8 编码的响应。 而不是

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

      替换为

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

      【讨论】:

        【解决方案3】:

        í 字符返回为”与“? 返回为?”是不同的问题

        前者通常发生在 í 的字节未编码为 UTF-8 时。请注意,在 MySQL 中,对于该字符和所有其他欧洲字符的正确编码,utf8mb3 和 utf8mb4 是相同的。修复连接(如 VGR 所讨论的)可能无法修复它。只有当浏览器未设置为 UTF-8 (Unicode) 时,才会出现黑色菱形。

        “一堆便便”仅在 utf8mb4 中可用,在 utf8mb3 中不可用。因此,假设客户端正确地使用了十六进制 F09F92A9,那么连接参数(请参阅 VGR)可能会导致问题。

        (更多讨论在您提供的链接中。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          相关资源
          最近更新 更多