csv 如何在MySQL表中存储表情符号?什么都试过了

js81xvg6  于 2023-02-14  发布在  Mysql
关注(0)|答案(1)|浏览(181)

我有一个CSV文件,其中包含带有表情符号(例如"酷!")的推文,我需要将它们导入MySQL表,以便正确保存/显示它们...我必须设置什么以及如何正确导入(我指的是排序等)?💕") and I need to import them into a MySQL table in such a way they will be saved/displayed correctly... What do I have to set up and how for a correct import (I mean collation, etc.)?
更多详情:

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

我已经试过了

  • 在表中将字符集设置为utf8mb4并将归类设置为utf8mb4_unicode_ci
  • 增加"设置名称'utf8mb4';"(也尝试使用Latin1),然后执行LOAD查询
hpxqektj

hpxqektj1#

该表必须使用字符集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支持emojis,不同的是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是utf8在MySQL 8.0中作为别名的字符集。
要转换现有列,请使用:

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以明确。

相关问题