如何将笑脸插入MySQL(😊)


18

我在MySQL 5.5.21上,尝试插入'\ xF0 \ x9F \ x98 \ x8A'笑脸字符。但是对于我的一生,我不知道该怎么做。

根据我一直在阅读的各种论坛,这是可能的。但是只要我尝试一下,数据就会被截断。

mysql> INSERT INTO hour  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  
       `indegree` ,  `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   
       VALUES ( "title" ,  "content 😊  content" ,  "guid" ,  1,  1,   
                     "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level   | Code | Message                                                                       |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1                                |
+---------+------+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|           687302 |
+------------------+
1 row in set (0.00 sec)

mysql> select * from hour where id = 687302;
+--------+-------+----------+------+---------------------+
| id     | title | content  | guid | published           |
+--------+-------+----------+------+---------------------+
| 687302 | title | content  | guid | 0000-00-00 00:00:00 |
+--------+-------+----------+------+---------------------+
1 row in set (0.00 sec)

但是我的表定义如下。

CREATE TABLE `hour` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8 NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687560 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 

可以看到我正在使用CHARSET = utf8mb4。这样肯定可以解决多字节字符使用方面的问题吗?

好的,所以我没有注意到:

  `content` text CHARACTER SET utf8 NOT NULL,

我已经纠正了这个问题,但仍然得到了一些时髦的结果。

CREATE TABLE `hourtmp` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687563 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 |

 mysql> INSERT INTO hourtmp  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  `indegree` ,  
 `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   VALUES ( "title" ,  "content 😊  content" ,  
 "guid" ,  1,  1,   "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
 Query OK, 1 row affected, 2 warnings (0.00 sec)

 mysql> show warnings;

 | Level   | Code | Message                                                                       |

 | Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
 | Warning | 1265 | Data truncated for column 'published' at row 1                                |

 2 rows in set (0.00 sec)

 mysql> select * from hourtmp;
 +--------+-------+-----------------------+
 | id     | title | content               |
 +--------+-------+-----------------------+
 | 687560 | title | content ????  content |
 | 687561 | title | content ????  content |
 +--------+-------+-----------------------+

我现在消除了应用程序层中的所有特殊字符,因此这对我来说不是什么大问题。但是,我想知道是否有可能以某种方式使数据进出MySQL。
布莱恩·亨特

不是MySQL专家,但您也不能uft8为该TEXT字段指定
JNK 2012年

您是否运行过设置名称utf8mb4;从您的客户签发插页之前?
atxdba

JNK,文本字段使用表默认值,在本例中为utf8mb4。
布赖恩·亨特

atxdba。感谢您的建议,仍然显示为?,这可能意味着已损坏。那些表情符号/霸天虎!;)
Bryan Hunt 2012年

Answers:


22

我最近写了一份详细的指南,介绍如何从MySQL切换utf8utf8mb4。如果您按照此处的步骤操作,则所有内容均应正常运行。这是过程中每个步骤的直接链接:

我怀疑通过执行步骤5可以解决您的问题。希望这对您有所帮助!


1
离开了这项工作,因此无法测试/验证。但是我怀疑缺少排序规则服务器= utf8mb4_unicode_ci设置。好教程!
布莱恩·亨特

非常好的Mathias。提醒大家,您的客户端连接详细信息很重要。我正在使用mysql来自Node 的NPM模块,并且需要charset: 'utf8mb4'createConnection()调用中指定,否则Incorrect string value即使将表和列转换为utf8mb4字符集和排序规则后,插入真正的UTF8字符仍然会因错误而失败。我希望您在步骤5中的客户端配置级别详细信息会产生类似的效果。
Neek

2

请执行以下操作:

  1. 将数据库字符集设置为utf8mb4

  2. 将列的字符集设置为utf8mb4

像下面的查询:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

这些步骤真的足够了吗?接受的答案还有更多。
科林·哈特

取决于问题所在,如果问题出在数据库方面,就足够了。但这也很可能是客户端连接问题。
spydon '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.