为啥我不能在 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 collation_connection utf8mb4_unicode_ci collation_database utf8_general_ci collation_server utf8_general_ci
foo
列的排序规则是 uft8_general_ci。
那么为什么我在这个设置中会出现这个错误,最好的解决方法是什么?
【问题讨论】:
【参考方案1】:\x80
和\xFF
之间没有有效的utf8编码,所以错误是正确的。
Code point 160 (0xA0)(也称为 
或 
),在utf8中,是一个2字节的字符,编码为0xC2
0xA0
。
同样,代码点 150 (0x96) 被编码为 0xC2
0x96
。
使用有效的 utf8 编码您的字符串是正确的解决方案。
我是 MySQL DBA,不是 PHP 专家(尽管我的 PHP 铜牌徽章),但显然 PHP 7 引入了unicode codepoint escape literals,因此您显然可以使用"\ua0"
。
【讨论】:
最好将文本切换为 utf8。但如果不能,则将连接切换到latin1
。以上是关于为啥我不能在 MySQL 表中插入某些字符?的主要内容,如果未能解决你的问题,请参考以下文章