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

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

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

列的排序规则是utf8_general_ci。

有什么问题吗?


当前回答

假设您正在使用phpmyadmin来解决此错误,请遵循以下步骤:

phpMyAdmin your_table “结构”选项卡 将字段的Collation从latin1_swedish_ci(或其他什么)更改为utf8_general_ci

其他回答

提示:在AWS RDS上,你需要一个新的参数组为你的MySQL数据库的参数(而不是编辑my.cnf)

collation_connection: utf8mb4_unicode_ci collation_database: utf8mb4_unicode_ci collation_server: utf8mb4_unicode_ci character_set_client: utf8mb4 character_set_connection: utf8mb4 character_set_database: utf8mb4 character_set_results: utf8mb4 character_set_server: utf8mb4

注意:character_set_system保持“utf8”

这些SQL命令不会永久工作-只在会话中:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

我想结合几篇文章来完整地回答这个问题,因为它看起来确实是几个步骤。

以上建议来自@madtracey

-等一下-等一下

[mysql]
default-character-set=utf8mb4

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
##
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

同样,从上面的建议来看,所有jdbc连接都从它们中删除了characterEncoding=UTF-8和characterSetResults=UTF-8

使用这个set -Dfile。encoding=UTF-8似乎没有什么区别。

我仍然不能写入国际文本到db得到同样的失败,如上所述

现在使用这个如何将整个mysql数据库字符集和排序规则转换为utf-8

更新所有的数据库,使用utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

运行这个查询,它将为您提供需要调用的内容

SELECT CONCAT(
'ALTER TABLE ',  table_name, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ', 
'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'YOURDB'
AND
(C.CHARACTER_SET_NAME != 'utf8mb4'
    OR
 C.COLLATION_NAME not like 'utf8mb4%')

在编辑器中复制粘贴输出,当连接到正确的db时,将所有|替换为无post回mysql。

这就是我要做的一切,而且似乎对我很有效。不是-Dfile。encoding=UTF-8未启用,它似乎按预期工作

还有问题吗? 我当然是在生产中,所以事实证明你确实需要检查上面所做的事情,因为它有时不起作用,这里是原因和解决方案:

show create table user

  `password` varchar(255) CHARACTER SET latin1 NOT NULL,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,

你可以看到一些仍然是拉丁文 试图手动更新记录:

ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

让我们缩小范围:

mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL;
Query OK, 5 rows affected (0.01 sec)

简而言之,为了让更新工作,我必须减小字段的大小。

现在当我跑步的时候:

mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

都能正常工作

只做

ALTER TABLE `some_table` 
CHARACTER SET = utf8 , COLLATE = utf8_general_ci ;

ALTER TABLE `some_table` 
CHANGE COLUMN `description_with_latin_or_something` `description` TEXT CHARACTER SET 'utf8' NOT NULL ;

假设您正在使用phpmyadmin来解决此错误,请遵循以下步骤:

phpMyAdmin your_table “结构”选项卡 将字段的Collation从latin1_swedish_ci(或其他什么)更改为utf8_general_ci

就我而言,我尝试了以上所有方法,但都没用。我非常确定,我的数据库如下所示。

mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using  EditLine wrapper

Connection id:      12
Current database:   xxx
Current user:       yo@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.17-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         42 min 49 sec

Threads: 1  Questions: 372  Slow queries: 0  Opens: 166  Flush tables: 1  Open tables: 30  Queries per second avg: 0.144

所以,我在每个表中查找列字符集

show create table company;

原来列字符集是拉丁文。这就是为什么我无法将中文插入数据库。

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

这可能对你有帮助。:)