2015-05-04 56 views
0

在mysql交互界面中插入表情符号时,发现一些现象非常混乱。希望有人能清除它。现在请看下图:有关将表情符号插入到mysql表中的一些混淆现象

mysql> show variables like 'character%'; 
+--------------------------+---------------------------------------+ 
| 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  | latin1        | 
| character_set_system  | utf8         | 
| character_sets_dir  | /opt/mysql/server-5.6/share/charsets/ | 
+--------------------------+---------------------------------------+ 
CREATE TABLE `t` (
`data` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
mysql> insert into t select '\U+1F600'; 
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x80' for column 'data' at row 1 
mysql> set names utf8mb4; 
mysql> insert into t select '\U+1F600'; 
Query OK, 1 row affected (0.00 sec) 
mysql> select * from t; 
+------+ 
| data | 
+------+ 
|  | 
+------+ 
mysql> select data, hex(data) from t; 
+------+-----------+ 
| data | hex(data) | 
+------+-----------+ 
|  | F09F9880 | 
+------+-----------+ 

为什么需要执行一套名utf8mb4明确?从错误消息看来,它似乎将数据内容解析为四个字节(f0 9f 98 80)?为什么仍然无法成功插入?

下面是我的另一个难题。

mysql> show variables like 'character%'; 
+--------------------------+---------------------------------------+ 
| Variable_name   | Value         | 
+--------------------------+---------------------------------------+ 
| character_set_client  | latin1        | 
| character_set_connection | latin1        | 
| character_set_database | latin1        | 
| character_set_filesystem | binary        | 
| character_set_results | latin1        | 
| character_set_server  | latin1        | 
| character_set_system  | utf8         | 
| character_sets_dir  | /opt/mysql/server-5.6/share/charsets/ | 
+--------------------------+---------------------------------------+ 
mysql> insert into t select '\U+1F600'; 
Query OK, 1 row affected (0.01 sec) 
mysql> select data,hex(data) from t; 
+------+--------------------+ 
| data | hex(data)   | 
+------+--------------------+ 
|  | C3B0C5B8CB9CE282AC | 
+------+--------------------+ 

我不得不说我对此感到有点震惊。在我看来,只有utf8mb4支持表情符号,但现在latin1也支持表情符号。 任何人都可以为我清除它。谢谢!

回答

0

您可以将UTF8数据插入到latin1表中,但MySQL不会将字节流视为UTF8字符。所以你将无法查询它。如果您的应用程序理解UTF8字节流,那么它看起来就像它的工作正常。但是,如果MySQL要将这些字节理解为Unicode字符,则表格字符集确实需要是utf8(或utf8mb4)。