【问题标题】:MySql and JDBC: change charset of a single column to utf8mb4MySql 和 JDBC:将单个列的字符集更改为 utf8mb4
【发布时间】:2019-12-22 21:34:41
【问题描述】:

我有一个“旧”数据库(在 utf 8 中),我在其中使用 JDBC 进行读写。现在,我还必须能够将表情符号存储到表格的一列中。 我已将相关列的字符集更改为 utf8mb4:

ALTER TABLE
myTable
CHANGE column_name column_name
longtext
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
NOT NULL;

但是,当我尝试在该列中插入表情符号时,我得到了著名的错误

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...'

我应该转换整个数据库,还是我做错了什么?

【问题讨论】:

  • 您使用哪个版本的 MySQL Connector/J,您使用哪些连接属性?您是否将 MySQL 服务器属性 character_set_server 设置为 utf8mb4?
  • 请提供SHOW CREATE TABLE myTable -- 我不会验证该列的声明是否正确。

标签: mysql jdbc utf-8 utf8mb4


【解决方案1】:

需要连接与utf8mb4获取?

?useUnicode=yes&characterEncoding=UTF-8getConnection() 调用中。

作为后备,在连接后执行SET NAMES utf8mb4。 (见评论)

"对于 Connector/J 8.0.12 及更早版本:为了使用utf8mb4 字符集进行连接,服务器必须配置character_set_server=utf8mb4;如果不是这样,当UTF-8 是用于连接字符串中的字符编码,会映射到MySQL字符集名称utf8,即utf8mb3的别名。'

【讨论】:

  • MySQL Connector/J documentation 明确表示不要使用SET NAMES"警告:不要使用 Connector/J 发出查询 SET NAMES,因为驱动程序不会检测到字符集有已被查询更改,并将继续使用首次建立连接时配置的字符集。"
  • 已与 MySQL Connector/J 版本 8.0.17 确认。所需的只是连接 URL 中的useUnicode=true&characterEncoding=utf8。即使服务器的默认字符集是latin1 而数据库的默认字符集是utf8(不是utf8mb4)也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2023-03-17
  • 2018-06-08
  • 1970-01-01
  • 2016-11-18
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多