为啥我不能在 MySQL 表中插入某些字符?

Posted

技术标签:

【中文标题】为啥我不能在 MySQL 表中插入某些字符?【英文标题】:Why can't I insert certain characters into a MySQL table?为什么我不能在 MySQL 表中插入某些字符? 【发布时间】:2017-09-08 23:57:31 【问题描述】:

我正在尝试执行 mysql 插入操作,但收到如下错误消息:

不正确的字符串值:第 1 行的列 'foo' 的 '\xA0'

\xA0\x96 都会出现这种情况。

我正在使用 php,并将此查询传递给 mysqli_query():

INSERT INTO ttest1 (foo) VALUES("test\xA0")

这里是创建表:

创建表 ttest1 (
    test_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    foo VARCHAR(32))

这是 MySQL 的字符集和排序规则信息:

character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8
character_set_filesystem 二进制
character_set_results utf8mb4
character_set_server utf8
character_set_system utf8

collat​​ion_connection utf8mb4_unicode_ci
collat​​ion_database utf8_general_ci
collat​​ion_server utf8_general_ci

foo 列的排序规则是 uft8_general_ci。

那么为什么我在这个设置中会出现这个错误,最好的解决方法是什么?

【问题讨论】:

【参考方案1】:

\x80\xFF之间没有有效的utf8编码,所以错误是正确的。

Code point 160 (0xA0)(也称为  ),在utf8中,是一个2字节的字符,编码为0xC20xA0

同样,代码点 150 (0x96) 被编码为 0xC2 0x96

使用有效的 utf8 编码您的字符串是正确的解决方案。

我是 MySQL DBA,不是 PHP 专家(尽管我的 PHP 铜牌徽章),但显然 PHP 7 引入了unicode codepoint escape literals,因此您显然可以使用"\ua0"

【讨论】:

最好将文本切换为 utf8。但如果不能,则将连接切换到latin1

以上是关于为啥我不能在 MySQL 表中插入某些字符?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MySQL 表中插入 ♥ 字符

MySQL操作——增删改

在 MySQL 表中同时插入和更新转义字符、单引号和双引号

使用php捕获某些字符

mysql 为啥我设置一个表的字段not null,为啥还可以插空?

mysql数据库在安装时默认的字符集编码为utf8但是为啥向数据库插入中文出现乱码,