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

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

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

列的排序规则是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;

这可能对你有帮助。:)

其他回答

包含\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)

在尝试了许多查询之后,终于成功了

ALTER TABLE
table_name
CHANGE column_name column_name 
varchar(256)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

只做

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 ;

这不是推荐的解决方案。但值得分享。因为我的项目是升级数据库从旧的Mysql到最新的(8).但我不能改变表结构,只有数据库配置(Mysql)。mysql服务器的解决方案。

Windows测试 mysql 8.0.15 在mysql配置中搜索

sql模式= "…"

取消它。或者在我的例子中,只需输入/添加

sql模式= " NO_ENGINE_SUBSTITUTION "

为什么不推荐解决方案。因为如果你用拉丁语(我的情况)..数据插入成功,但没有插入内容(mysql没有响应错误!!)例如,你输入这样的信息

等等 \x12

它保存

[盒子]

好吧. .对于我的问题…我可以把字段改为UTF8..但是有一个小问题。参见上面关于其他解决方案失败的答案,因为字没有插入,因为包含超过2个字节(cmiiw)..这个解决方案使您的插入数据变成方框。合理的是使用blob..你可以跳过我的回答。

另一个与此相关的测试是..在保存之前对代码使用utf8_encode。我使用latin1和它是成功的(我不使用sql模式)!与上面使用base64_encode的答案相同。

我的建议是分析你的表格需求,并尝试从其他格式改为UTF8

如果您正在创建一个新的MySQL表,您可以在创建时指定所有列的字符集,这为我解决了这个问题。

CREATE TABLE tablename (
<list-of-columns>
)
CHARSET SET utf8mb4 COLLATE utf8mb4_unicode_ci;

你可以阅读更多详细信息:https://dev.mysql.com/doc/refman/8.0/en/charset-column.html