关于MySQL Workbench和JDBC中的java:utf8mb4

utf8mb4 in MySQL Workbench and JDBC

我一直在使用UTF-8编码的MySQL数据库,现在它需要能够存储4字节的表情符号,因此我决定将utf8编码更改为utf8mb4:

1
2
3
4
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"字符集服务器= utf8"更改为"字符集服务器= utf8mb4"

这些步骤之后,我能够存储表情符号(为??),但是仅当在MySQL控制台中执行SQL查询时:当我尝试从MySQL Workbench或Wildfly Webapp启动查询时,出现此错误:

Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1

我认为我需要更改客户端连接到数据库的方式,但是我不知道如何使用。我已经阅读了有关在JDBC中使用" useUnicode = yes"的内容,但是不起作用。

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

编辑:
如评论中所建议,我尝试使用:

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

谢谢!


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

  • 如@ mike-adamenko所建议,将my.cnf设置为以下内容
  • [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

  • 在mysql中执行:

    SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

  • 删除涉及的过程,然后重新创建它们。它们将位于utf8mb4中。
    可以检查

  • SHOW PROCEDURE STATUS where name LIKE 'procedure_name';


    characterEncoding=utf8用于jdbc url

    1
    jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8

    还要检查您是否已配置MySQL与utf8mb4一起使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        [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

    看这里


    从MySQL Connector / J 5.1.47开始,

    When UTF-8 is used for characterEncoding in the connection string, it maps to the MySQL character set name utf8mb4.

    您可以在这里查看文档


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

    基本上,可以按照上述文档更改ALTER TABLE脚本,然后可以在连接字符串中使用以下参数使更改生效。

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

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