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

20

这是我的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)

这是我的评论模式:

    +------------+---------------+------+-----+---------+----------------+
    | 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查询的输出:

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

目前还不太确定如何解决。可能需要使用php过滤评论文本以适应该字符串值。


3
您在MySQL中使用的排序和字符集设置是什么? - NullUserException
@NullUserException,你确定数据库的字符集是latin1,排序规则是latin1_swedish_ci吗? - somejkuser
2
你需要使用utf8编码。那是一个表情符号;http://www.fileformat.info/info/unicode/char/1f61c/index.htm 或者你可以过滤它;但最好还是保留所有字符。这些链接可能会对你有所帮助:https://dev59.com/13VC5IYBdhLWcg3wfhGL 和 https://dev59.com/_GIj5IYBdhLWcg3wTDZn - chris85
1
顺便提一下,实际上只有两个VARCHAR长度是重要的:255和65535。长度不超过255个字符的VARCHAR使用strlen($value)+1字节进行存储,额外的一个字节用于存储字符串的长度。长度在256-65535个字符之间的VARCHAR需要额外的字节来存储长度。指定除255或65535以外的值对性能或存储需求没有影响,但本质上只是完整性约束。 - Sammitch
7个回答

37

您的�境未正确设置处�Unicode文本。

字节�列F0 9F 98 9C,在您的查询中被错误地表示为“😜�,是Unicode字符“😜�,�FACE WITH STUCK-OUT TONGUE AND WINKING EYE的UTF8编�。(也就是说,它是一个表情符�字符。)

�正确存储此字符,您需�确�:

  • 在MySQLè¿�æ�¥ä¸Šå�¯ç”¨UTF8(å�³SET NAMES utf8mb4,或者在è¿�æ�¥æ—¶ä½¿ç”¨ç±»ä¼¼çš„选项å�¯ç”¨å®ƒï¼‰ã€‚
  • è¿�è¡ŒMySQL 5.5或更高版本。
  • 您的表的字符集为utf8mb4。

这里的关键点是表情符号是4字节UTF8编码,而MySQL默认使用3字节UTF8编码。 - Sammitch
根据评论,OP甚至没有使用UTF8;他们提到他们的表字符集目前是latin1。:( - user149341
@Sammitch 我已经将 mysqli_set_charset 函数应用于 utf8,并正在努力使表格达到 4 字节。 - somejkuser
5
SET NAMES utf8是不够的,你需要使用SET NAMES utf8mb4。详情请见: https://dev59.com/alkT5IYBdhLWcg3wFroT - Hubert Schölnast

5

将连接到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)

另外,请确保表格的列和表本身都使用相同的utf8mb4编码。

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;

4

将连接到mysql的字符集从SET NAMES utf8更改为SET NAMES utf8mb4


1

1
尝试在将数据插入表格之前对其进行编码。
在PHP中,您可以使用utf8_encode()轻松地对数据进行编码。
要在PHP中解码数据,可以使用utf8_decode
谢谢!

0
在Django的情况下:
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':  '',
    'USER': '',
    'PASSWORD': '',
    'CONN_MAX_AGE': 60,
    'OPTIONS': {'charset': 'utf8mb4'}, // add this line
}

0
如果在mysql shell中什么都不起作用,尝试在mysqld.cnf中更改一些设置。
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4

原始答案 MySQL utf8mb4,保存Emoji时出错 致谢:user3624198


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接