【问题标题】: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。

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

【问题讨论】:

    标签: mysql special-characters collation


    【解决方案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,因此您显然可以使用"\u{a0}"

    【讨论】:

    • 最好将文本切换为 utf8。但如果不能,则将连接切换到latin1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多