mysql - mysql表中插入emoji字符的一些令人困惑的现象

标签 mysql emoji

在mysql交互界面中插入emoji字符时,我发现一些现象非常令人困惑。希望有人可以清除它。现在请看下面:

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 也支持表情符号字符。 任何人都可以帮我清除。谢谢!

最佳答案

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

关于mysql - mysql表中插入emoji字符的一些令人困惑的现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023524/

相关文章:

mysql - 如何使用TRUNCATE语句避免MySql将其写入binlog?

mysql - MYSQL 中加密数据的数据类型

php - MySQL、UTF-8 和 Emoji 字符

javascript - 如何在 JavaScript 中将一个表情符号字符转换为 Unicode 代码点编号?

android - 如何在 Android EditText 中显示 iOS 风格的 Emoji 字符?

php - Laravel 5.1 - 使用 where Eloquent 查询数据透视表的字段

mysql 查询需要300多秒

php - 如何查看我使用的数据的结果或输出?

javascript - 让我的网站支持表情符号?

javascript - 为什么 document.write ('\ud83d\ude00' ) 可以在 UTF-8 字符集的 HTML 中输出表情符号?