这是我的连接设置: Connection conn = DriverManager。getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8",用户名,密码);

我得到以下错误时轮胎添加一行到一个表: 错误的字符串值:'\xF0\x90\x8D\x83\xF0\x90…在第1行为“content”列

我插入数千条记录,当文本包含\xF0时,我总是得到这个错误(即不正确的字符串值总是以\xF0开始)。

列的排序规则是utf8_general_ci。

有什么问题吗?


当前回答

您需要在元html和服务器alter表中设置utf8mb4,并将collation设置为utf8mb4

其他回答

MySQL的utf8只允许用3字节UTF-8表示的Unicode字符。这里有一个需要4个字节的字符:\xF0\x90\x8D\x83 (U+10343 GOTHIC LETTER SAUIL)。

如果你有MySQL 5.5或更高版本,你可以将列编码从utf8改为utf8mb4。这种编码允许在UTF-8中存储占用4个字节的字符。

您可能还必须在MySQL配置文件中将服务器属性character_set_server设置为utf8mb4。Connector/J默认为3字节Unicode:

例如,要在Connector/J中使用4字节UTF-8字符集,请使用character_set_server=utf8mb4配置MySQL服务器,并将characterEncoding排除在Connector/J连接字符串中。Connector/J将自动检测UTF-8设置。

包含\xF0的字符串只是使用UTF-8编码为多个字节的字符。

尽管您的排序规则设置为utf8_general_ci,但我怀疑数据库、表甚至列的字符编码可能不同。它们是独立的设置。试一试:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  
    CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;

将实际数据类型替换为VARCHAR(255)

我在我的rails项目中遇到了同样的问题:

Incorrect string value: '\xF0\xA9\xB8\xBDs ...' for column 'subject' at row1

解决方案1:在保存到db之前将字符串转换为base64通过base64 .encode64(subject) 然后使用Base64.decode64(subject)

解决方案2:

步骤1: 更改主题列的字符集(和排序规则)

ALTER TABLE t1 MODIFY
subject VARCHAR(255)
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

步骤2:在数据库中。yml使用

encoding :utf8mb4

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

Character_set_client、character_set_connection、character_set_results为utf8mb4: Character_set_client和character_set_connection为客户端发送语句的字符集,character_set_results为服务器端返回查询结果给客户端的字符集。 看到charset-connection。 表和列编码为utf8mb4

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

解决方案一(需要重启MySQL):

修改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。

重新启动MySQL 将表和列编码更改为utf8mb4 停止在jdbc连接器中指定characterEncoding=UTF-8和characterSetResults=UTF-8,因为这将覆盖character_set_client, character_set_connection, character_set_results到utf8

解决方案二(不需要重启MySQL):

将表和列编码更改为utf8mb4 在jdbc连接器中指定characterEncoding=UTF-8,因为jdbc连接器不支持utf8mb4。 像这样写你的sql语句(需要添加allowMultiQueries=true到jdbc连接器): SET NAMES utf8mb4;INSERT INTO Mytable…

这将确保到服务器、character_set_client、character_set_connection、character_set_results的每个连接都是utf8mb4。 参见字符集连接。

删除模式并使用utf8mb4字符集重新创建它解决了我的问题。