【问题标题】:MySQL Incorrect string value errorMySQL 不正确的字符串值错误
【发布时间】:2016-02-22 02:51:30
【问题描述】:

在具有 MySQL DB 后端用户的 Django 应用程序中,尝试插入包含一些表情符号和心形以及 Unicode 字符的内容的注释。 MySQL 拒绝操作并报错:

(1366, "Incorrect string value: '\\xE2\\x9D\\xA4\\xEF\\xB8\\x8F' for column 'note' at row 1")

(有问题的列具有longtext 类型。在这种情况下,Unicode 字符有效,它是心脏和修饰符https://codepoints.net/U+2764https://codepoints.net/U+FE0F,所以它们不是4 字节长的UTF-8 字符。我确定 MySQL 的默认字符集是 utf-8。)

有趣的是,我无法在本地开发人员环境中完全重现此错误。一个特别的区别是它只针对该异常发出警告。


更新1:

这仍然困扰着我:

mysql> SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name="sblive";
+----------------------------+
| default_character_set_name |
+----------------------------+
| latin1                     |
+----------------------------+
1 row in set (0.00 sec)

我将特定表的字符集转换为 utf-8:

mysql> alter table uploads_uploads convert to character set utf8 COLLATE utf8_general_ci;
Query OK, 1209036 rows affected (1 min 10.31 sec)
Records: 1209036  Duplicates: 0  Warnings: 0

mysql> SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = "sblive" AND table_name = "uploads_uploads" AND column_name = "note";
+--------------------+
| character_set_name |
+--------------------+
| utf8               |
+--------------------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

mysql> SHOW VARIABLES LIKE '%colla%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | utf8_unicode_ci   |
+----------------------+-------------------+
3 rows in set (0.00 sec)

【问题讨论】:

    标签: mysql configuration character-encoding warnings non-ascii-characters


    【解决方案1】:

    您要求❤️ 后跟“无间距”“VARIATION SELECTOR-16”。

    • 你的字节是 utf8——很好
    • 您的连接需要指定 utf8 - 是吗?
    • 您的TEXT 列需要声明CHARACTER SET utf8 -- 是吗?使用SHOW CREATE TABLE 进行验证。
    • 如果您使用的是 HTML,则需要说 charset=UTF-8 -- 是吗?

    如果“后端用户”可能会输入更多表情符号,建议您切换到utf8mb4——“表情符号”将需要它。

    附录

    让我们检查数据...请运行这个

    SELECT col, HEX(col) FROM ...
    

    这两个字符应该提供十六进制 E29DA4EFB88F。如果你看到C3A2C29DC2A4C3AFC2B8C28F,你有“双重编码”,这是一个更混乱的问题。 2764FE0F 表示 utf16,我想。

    【讨论】:

    • 我确保特定表是 UTF-8 和 alter table table_name convert to character set utf8;。 HTML 是一个 REST API 请求,有效负载以 JSON 格式提供。我尝试在标头中指定字符集 (Content-Type: application/json; charset=utf-8),但这并没有影响这种情况(技术上,在有效负载中,这些字符以 UTF-16 编码的 BTW 出现)。
    • 我向服务器添加了配置,将所有内容默认为 UTF-8。 character_set_database (show variables like "character_set_database";) 仍然是 latin1(注意:在我在配置文件中显式默认所有可能的 UTF-8 后,我重新启动了服务器)。但是现在表格和特定列的字符集应该将其覆盖为 UTF-8,不是吗?
    • utf-16 来自哪里?那和utf8不一致(但是可以转换)
    • SHOW VARIABLES LIKE 'char%'; -- 其中3个需要是utf8,_database不重要。
    • 我用一些细节更新了这个问题。我仍然遇到同样的错误。我应该担心这个:SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name="sblive"; 返回latin1
    猜你喜欢
    • 2012-02-01
    • 2012-11-08
    • 2017-03-18
    • 1970-01-01
    • 2017-01-17
    • 2012-09-05
    • 2017-10-25
    • 2013-10-10
    • 2011-09-13
    相关资源
    最近更新 更多