如何在MySQL 8.0中正确处理字符编码?

fdx2calv  于 2023-11-16  发布在  Mysql
关注(0)|答案(1)|浏览(119)

我只是尝试创建一个新表并向其中导入一些值,但我有一个编码问题,我似乎无法解决。
以下是有关我的环境的character_setcollation信息:

mysql> show variables like 'char%';
+--------------------------+-------------------------------------------------+
| Variable_name            | Value                                           |
+--------------------------+-------------------------------------------------+
| character_set_client     | cp850                                           |
| character_set_connection | cp850                                           |
| character_set_database   | latin1                                          |
| character_set_filesystem | binary                                          |
| character_set_results    | cp850                                           |
| character_set_server     | utf8mb4                                         |
| character_set_system     | utf8mb3                                         |
| character_sets_dir       | c:\wamp64\bin\mysql\mysql8.0.31\share\charsets\ |
+--------------------------+-------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)

mysql> show variables like 'coll%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | cp850_general_ci   |
| collation_database   | latin1_swedish_ci  |
| collation_server     | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
3 rows in set, 1 warning (0.00 sec)

字符串
我也有一个test.sql,它包含:

SET default_storage_engine=INNODB;

DROP TABLE IF EXISTS `chapitres`;

CREATE TABLE chapitres (
  id TINYINT UNSIGNED AUTO_INCREMENT NOT NULL,
  titre VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
)
DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;

INSERT INTO chapitres
  (id, titre)
VALUES
  ('1', 'é');


如果我导入test.sql文件如下:

mysql> source test.sql
Query OK, 1 row affected (0.00 sec)


我没有得到想要的结果:

mysql> select * from chapitres;
+----+-------+
| id | titre |
+----+-------+
|  1 | Ú     |
+----+-------+
1 row in set (0.00 sec)


我期待一个é,我得到了一个Ú。你能帮助我了解我错过了什么吗?非常感谢你的帮助!

tmb3ates

tmb3ates1#

进一步浏览后,我注意到é在cp 850中被编码为0082。这对应于ISO 8859-1UTF-8中的00E9Ùcp850中的00E9
我通过将test.sql编码为cp850或简单地将其内容复制/粘贴为DBeaver中的SQL语句来解决我的问题。
我不知道为什么character_set_clientcharacter_set_connection被设置为cp850,这可能是Windows的默认设置,但我还没有准备好冒险进入那个兔子洞。

相关问题