如何在MySQL表中存储表情符号?尝试了一切

How to store emojis in a MySQL table? Tried everything

提问人:user3607534 提问时间:2/11/2023 更新时间:2/12/2023 访问量:310

问:

我有一个CSV文件,其中包含带有表情符号的推文(例如。“太酷了!💕 “),我需要将它们导入 MySQL 表中,以便它们能够正确保存/显示...... 我必须设置什么以及如何正确导入(我的意思是排序规则等)?

更多详情:

  • 在 CSV 文件中,表情符号是可见的
  • CSV 文件的编码为 UTF-8
  • 我在 Windows 11 上

我已经试过了:

  • 在表中将字符集设置为 utf8mb4 并将排序规则设置为utf8mb4_unicode_ci
  • 添加“ SET NAMES 'utf8mb4';”(也尝试过 Latin1) 在 LOAD 查询之前
mysql csv utf-8 排序规则 utf8mb4

评论

1赞 user1191247 2/11/2023
我可能是错的,但是当您说“在CSV文件中,表情符号可见”时,这取决于您如何“查看”CSV。如果您在处理显示层中表情符号的应用程序中打开它,那么它们将显示为小图像。如果你在记事本中打开它,你会看到实际的文本。“通常”,在应用程序的显示层中发生少量图像的替换。
0赞 user1191247 2/11/2023
在您的示例中(“酷!💕 “),它是 unicode 字符 U+1F495
1赞 skomisa 2/12/2023
就目前而言,你的问题太模糊了。你能澄清一下当你“尝试一切”时实际发生了什么吗?您的具体问题是什么?
1赞 Evert 2/12/2023
1. 如何导入文件?2. 共享完整的表结构 ()。3. 你如何验证它不起作用?什么读这个,在哪里/如何?4. 你看到了什么?SHOW CREATE TABLE
0赞 Rick James 2/12/2023
💕 是 4 个十六进制字节: F09F9295 -- 这是你看到的吗?尝试。SELECT HEX(col)...

答:

1赞 Bill Karwin 2/12/2023 #1

该表必须以字符集 utf8mb4 对文本进行编码才能存储表情符号。

演示:

mysql> create table no ( t text ) character set=utf8;

mysql> load data local infile 'm.csv' into table no;

mysql> select * from no;
+---------+
| t       |
+---------+
| Cool! ? |
+---------+

所以 utf8 不支持表情符号。

mysql> create table yes ( t text ) character set=utf8mb4;

mysql> load data local infile 'm.csv' into table yes;

mysql> select * from yes;
+------------+
| t          |
+------------+
| Cool! 💕     |
+------------+

但是 utf8mb4 确实支持表情符号。不同之处在于 utf8mb4 支持 4 字节编码,而 utf8 不支持。这是 MySQL 历史上一个不幸的部分,他们最初没有实现 utf8 来支持 UTF-8 标准的补充多语言平面。

让我们看看更改第一个表是否有帮助。

mysql> alter table no character set utf8mb4;

mysql> load data local infile 'm.csv' into table no;

mysql> select * from no;
+---------+
| t       |
+---------+
| Cool! ? |
| Cool! ? |
+---------+

为什么这不起作用?因为不转换现有列。它只会更改表的默认字符集,直到我们下次向该表添加列时才会使用该字符集。alter table ... character set

我们可以看到现有列仍在使用旧字符集:

mysql> show create table no\G
*************************** 1. row ***************************
       Table: no
Create Table: CREATE TABLE `no` (
  `t` text CHARACTER SET utf8mb3  
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

utf8mb3 是 MySQL 8.0 中的别名字符集。utf8

若要转换现有列,请使用:

mysql> alter table no convert to character set utf8mb4;

mysql> show create table no\G
*************************** 1. row ***************************
       Table: no
Create Table: CREATE TABLE `no` (
  `t` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

否,再次尝试加载:

mysql> load data local infile 'm.csv' into table no;

mysql> select * from no;
+------------+
| t          |
+------------+
| Cool! ?    |
| Cool! ?    |
| Cool! 💕     |
+------------+

请注意,有一天,MySQL 可能会将“utf8”别名更改为 utf8mb4。这在上述许多“utf8”用法的警告中显示出来:

“utf8”目前是字符集UTF8MB3的别名,但在将来的版本中将是UTF8MB4的别名。请考虑使用UTF8MB4以明确无误。