错误 1366 (HY000):不正确的字符串值:第 1 行的列 'comment' 的 '\xF0\x9F\x98\x9C'

Posted

技术标签:

【中文标题】错误 1366 (HY000):不正确的字符串值:第 1 行的列 \'comment\' 的 \'\\xF0\\x9F\\x98\\x9C\'【英文标题】:ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x9C' for column 'comment' at row 1错误 1366 (HY000):不正确的字符串值:第 1 行的列 'comment' 的 '\xF0\x9F\x98\x9C' 【发布时间】:2016-03-13 22:36:15 【问题描述】:

这是我的 sql:

INSERT INTO comments (createdate,userid,profileid,comment,status) 
VALUES (1449503167,65704,65704,'@Mr_S66 Wish I was There For The Xmas Party I Miss My Studio 66 Family 😜',15)

这是我的 cmets 架构:

    +------------+---------------+------+-----+---------+----------------+
    | Field      | Type          | Null | Key | Default | Extra          |
    +------------+---------------+------+-----+---------+----------------+
    | commentid  | int(11)       | NO   | PRI | NULL    | auto_increment |
    | parentid   | int(11)       | YES  |     | 0       |                |
    | refno      | int(11)       | YES  |     | 0       |                |
    | createdate | int(11)       | YES  |     | 0       |                |
    | remoteip   | varchar(80)   | YES  |     |         |                |
    | locid      | int(11)       | YES  | MUL | 0       |                |
    | clubid     | int(11)       | YES  |     | 0       |                |
    | profileid  | int(11)       | YES  | MUL | 0       |                |
    | userid     | int(11)       | YES  | MUL | 0       |                |
    | legacyuser | int(11)       | YES  | MUL | 0       |                |
    | mediaid    | int(11)       | YES  |     | 0       |                |
    | status     | int(11)       | YES  |     | 1       |                |
    | comment    | varchar(4000) | YES  |     |         |                |
    | likes      | int(11)       | YES  |     | 0       |                |
    | dislikes   | int(11)       | YES  |     | 0       |                |
    | import     | int(11)       | YES  |     | 0       |                |
    | author     | varchar(50)   | YES  |     |         |                |
    +------------+---------------+------+-----+---------+----------------+

这是我对sql query 的输出:

ERROR 1366 (HY000):不正确的字符串值:'\xF0\x9F\x98\x9C' 用于第 1 行的列 'comment'

还不太清楚如何解决这个问题。可能过滤评论文本using php 以容纳字符串值。

【问题讨论】:

您在 mysql 中的排序规则和字符集设置是什么? @NullUserException 字符集是 latin1 并且排序规则名称是 latin1_swedish_ci 数据库是否正确? 你需要是utf8。那是一个表情符号; fileformat.info/info/unicode/char/1f61c/index.htm 或者你可以过滤它;不过,拥有所有角色可能会更好。这些可能会对您有所帮助 ***.com/questions/279170/utf-8-all-the-way-through 和 ***.com/questions/20411440/… 顺便说一句,实际上只有两个 VARCHAR 长度很重要:255 和 65535。最多 255 个字符的 VARCHAR 使用 strlen($value)+1 字节进行存储,额外的字节存储字符串的长度。 VARCHARs 256-65535 个字符使用额外的字节作为长度。指定 255 或 65535 以外的值对性能或存储要求没有影响,但本质上只是完整性约束。 【参考方案1】:

在将数据插入表之前尝试对其进行编码。

在 PHP 中,您可以使用 utf8_encode() 轻松编码数据。

要在 PHP 中解码数据,您可以使用utf8_decode。

谢谢!

【讨论】:

【参考方案2】:

如果在 mysql shell 中不起作用,请尝试更改 mysqld.cnf 中的一些设置

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4

原答案MySQL utf8mb4, Errors when saving Emojis 致谢:user3624198

【讨论】:

【参考方案3】:

您的环境中的某些内容未设置为正确处理 Unicode 文本。

字节序列F0 9F 98 9C,在您的查询中错误地表示为“ðŸ∼œ”,是 Unicode 字符“?”的 UTF8 编码,面对伸出舌头和眨眼。 (也就是说,它是一个表情符号。)

要正确存储此字符,您需要确保:

您正在 MySQL 连接上启用 UTF8(即SET NAMES utf8mb4,或在连接时使用类似启用它的选项)。 您正在运行 MySQL 5.5 或更高版本。 您的表的字符集是utf8mb4

【讨论】:

这里的关键是emojis是4字节UTF8,mysql默认使用3字节UTF8。 @Sammitch 基于 cmets,OP 甚至没有使用 UTF8;他们提到他们的表格字符集目前是 latin1。 :( @Sammitch 我将函数 mysqli_set_charset 应用于 utf8 并且我正在努力将表格变为 4 个字节 SET NAMES utf8 不会这样做。你需要SET NAMES utf8mb4。见:***.com/q/39095860/1302716【参考方案4】:

将与 mysql 的连接从“SET NAMES utf8”更改为“SET NAMES utf8mb4”

在 PHP 中,使用 mysqli_set_charset 添加字符集, https://www.w3schools.com/php/func_mysqli_set_charset.asp

$conn = mysqli_connect("localhost","my_user","my_password","my_db");
if (mysqli_connect_errno()) 
   echo "Failed to connect to MySQL: " . mysqli_connect_error();


// Change character set to utf8
mysqli_set_charset($conn, ”utf8mb4”);

或者如果你在 NodeJS 中,(这是额外的信息,以防万一)

db_config =   
    host: "localhost",
    user: "user",
    password: "password",    
    database: "mydb",  
    charset: "utf8mb4_unicode_ci"

var conn = mysql.createConnection(db_config)

另外,请确保表格的列和表格本身是相同的uf8mb4编码。

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4;

ALTER TABLE my_table
   CHANGE COLUMN my_column my_column TEXT
   CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

【讨论】:

【参考方案5】:

将与 mysql 的连接从 SET NAMES utf8 更改为 SET NAMES utf8mb4

【讨论】:

【参考方案6】:

要保存表情符号字符,您必须将数据字段设置为 utf8m4b,因为 mysql utf8 仅使用 3 个字节来存储字符。在https://***.com/a/36274546/3792270查看我的解决方案

【讨论】:

以上是关于错误 1366 (HY000):不正确的字符串值:第 1 行的列 'comment' 的 '\xF0\x9F\x98\x9C'的主要内容,如果未能解决你的问题,请参考以下文章

关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案

SQL state [HY000]; error code [1366];

解决mysql插入中文字符报错的问题ERROR 1366 (HY000): Incorrect string value: ‘xE5xB0x8FxE6x98x8E‘ for column

Mysql数据库插入数据库报错, ERROR 1366 (HY000): Incorrect string value: '\xBE\xEA' for column &

MySQL ERROR 1366(HY000) Incorrect string value

如何修复“错误 130 (HY000):文件格式不正确”