尝试通过 JDBC 将 UTF-8 插入 MySQL 时出现“乱码”

这是我的连接设置方式:

Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

并且在尝试向表中添加行时出现以下错误:

Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

我正在插入数千条记录,当文本包含 \xF0 时,我总是收到此错误(即错误的字符串值总是以 \xF0 开头)。

该列的排序规则是 utf8_general_ci。

可能是什么问题呢?

回答

解决方法

遇到同样的问题,保存数据utf8mb4需要确保:

character_set_client, character_set_connection, character_set_results是utf8mb4:
character_set_client和character_set_connection指示字符集,其中的语句由客户端发送,
character_set_results指示字符集的服务器查询结果返回给客户端。

请参阅字符集链接

表和列编码是 utf8mb4

对于JDBC,有两种解决方案:

方案一(需要重启mysql):

  1. 修改my.cnf如下并重新启动MySQL:
[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci //这个可能会没有,那就添加进去


/*
这可以确保数据库character_set_client, character_set_connection, character_set_results是utf8mb4在默认情况下。
*/


  1. 重启MySQL

  2. 将你原先的表和列编码更改为 utf8mb4

方案二(不需要重启mysql):

  1. 将表和列编码更改为 utf8mb4

  2. characterEncoding=UTF-8在 jdbc 连接器中指定,因为 jdbc 连接器不支持utf8mb4.

  3. 像这样写你的sql语句(需要添加allowMultiQueries=true到jdbc连接器):

'SET NAMES utf8mb4;INSERT INTO Mytable ...';

这将确保与服务器的每个连接character_set_client,character_set_connection,character_set_results都是utf8mb4.

posted @ 2021-08-02 18:14  海绵寳寳  阅读(285)  评论(0)    收藏  举报