【问题标题】:utf8mb4 in MySQL Workbench and JDBCMySQL Workbench 和 JDBC 中的 utf8mb4
【发布时间】:2017-11-19 09:17:52
【问题描述】:

我一直在使用 UTF-8 编码的 MySQL DB,现在需要能够存储 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 "character-set-server = utf8" 改为 "character-set-server = utf8mb4"

在这些步骤之后,我可以存储表情符号(如????),但只有在 MySQL 控制台中执行 SQL 查询时:当我尝试从 MySQL Workbench 或 Wildfly webapp 启动查询时,我收到此错误:

错误代码:1366。不正确的字符串值:'\xF0\x9F\x92\xA2' 列 'SOURCE_CONTEXT' 在第 1 行

我假设我需要更改客户端连接到数据库的方式,但我不知道如何。我读过一些关于在 JDBC 中使用“useUnicode=yes”的内容,但不起作用。

${bdpath:3306/bstdb?useUnicode=yes}

编辑: 正如 cmets 中所建议的,我尝试了:

${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

谢谢!

【问题讨论】:

    标签: java mysql jdbc mysql-workbench utf8mb4


    【解决方案1】:

    使用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
    

    here

    【讨论】:

    • 使用“characterEncoding=utf8mb4”参数时根本无法建立连接::“java.sql.SQLException: Unsupported character encoding 'utf8mb4'。”
    • 您在这里指定Java编码,因此您应该使用UTF-8
    • 不,她不需要utf8编码
    • @MikeAdamenko "characterEncoding=utf8mb4" 绝对不行。
    【解决方案2】:

    最后,它起作用了。这是存储过程的问题,迁移后仍然是 utf8 而不是 utf8mb4。 这是一个两步的解决方案。

    1. 根据@mike-adamenko 的建议,将 my.cnf 设置为具有以下内容

    [客户端] 默认字符集 = utf8mb4

    [mysql] 默认字符集 = utf8mb4

    [mysqld] 字符集客户端握手 = FALSE 字符集服务器 = utf8mb4 排序服务器 = utf8mb4_unicode_ci

    1. 在mysql中执行:

      设置名称 utf8mb4 整理 utf8mb4_unicode_ci;

    2. 删除涉及的程序,然后重新创建它们。它们将在 utf8mb4 中。 可以检查

    SHOW PROCEDURE STATUS where name LIKE 'procedure_name';

    【讨论】:

    • 在我的回答中错过了配置文件部分,这对我来说是一个学习!
    • 您所说的“涉及的丢弃程序”是什么意思?对于您的第三点,您能否举例说明procedure_name 是什么?得到空结果:(
    • “涉及的过程”是指在给定数据库中自定义创建的那些,通过使用“CREATE PROCEDURE procedure_name etc etc”语句(“procedure_name”是您给该过程的名称,就像函数名一样)
    【解决方案3】:

    从 MySQL Connector/J 5.1.47 开始,

    连接字符串中的字符编码使用UTF-8时,映射到MySQL字符集名称utf8mb4。

    您可以查看文档here

    【讨论】:

      【解决方案4】:

      您可以按照适用于 MySQL 的文档来解决您的问题。这是MySQL documentation,您可以参考。

      基本上,您的ALTER TABLE 脚本可以根据上述文档进行更改,然后您可以在连接字符串中使用以下参数以使更改生效。

      jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
      

      在进行字符集和编码更改后,请不要忘记重新启动您的 MySQL 服务。

      【讨论】:

      • 使用“characterEncoding=utf8mb4”参数时根本无法建立连接:“java.sql.SQLException: Unsupported character encoding 'utf8mb4'。”
      • 您在这里指定Java编码,因此您应该使用UTF-8
      • 没什么。与开头相同的问题:History: error in method 'create' : java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA2' for column 'srcctxt' at row 1 :/
      猜你喜欢
      • 2018-10-03
      • 2019-12-22
      • 2016-03-21
      • 2018-04-14
      • 2019-02-05
      • 2019-03-25
      • 2019-01-21
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多