2015-05-04 21 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)。