【问题标题】:Special characters (Cyrillic, Chinese) to MySQL database特殊字符(西里尔文、中文)到 MySQL 数据库
【发布时间】:2016-04-25 11:01:55
【问题描述】:

我有一个 csv 文件,其中包含一些行,我想使用LOAD DATA INFILE MySQL 命令将这些行插入到 MySQL 表中。当我使用命令,并且插入准备好时,插入的特殊字符都乱了。该文件正确地存储了字符(我认为是这样,因为当我用像 EditPlus 这样的编辑器打开文件时,特殊字符都被破坏了,但是当用另一个编辑器(比如 EmEditor)打开时,特殊字符会正确显示),这些列将保存带有特殊字符的文本,它们是排序规则utf8_general_ci,它们是varchar 列或text 列。该表是一个InnoDB 表,排序规则设置为utf8_general_ci。我使用以下参数从 MariaDB 命令行运行 LOAD DATA INFILE 命令:

LOAD DATA INFILE '/path/to/csv/file' INTO TABLE tablename FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

编辑:我也尝试使用SET NAMES "utf8"; 命令,在使用LOAD DATA INFILE 之前,没有成功:|

【问题讨论】:

  • 对于中文,您可能需要utf8mb4 而不是utf8。某些表情符号和中文字符仅适用于 utf8mb4。 (西里尔文在这两种情况下都可以正常工作。)
  • 现在deceze的解决办法好像连汉字都可以了。
  • 大部分汉字都与utf8一起使用。只有 4 字节编码失败。

标签: mysql utf-8


【解决方案1】:

MySQL 需要知道保存文件的编码(字符集),以便正确读取和解释它。

服务器使用由 character_set_database系统变量解释信息 在文件中。 SET NAMEScharacter_set_client 的设置做 不影响输入的解释。如果输入文件的内容 使用不同于默认的字符集,通常是 最好通过使用指定文件的字符集 CHARACTER SET 子句。 binary 的字符集指定“否 转换。”

找出您的文件实际保存的编码,或从您的文本编辑器(已经正确解释字符的编辑器)将其显式保存为特定编码,然后将CHARACTER SET ... 添加到LOAD DATA 语句中。详情见文档:http://dev.mysql.com/doc/refman/5.7/en/load-data.html

【讨论】:

  • 好的,现在尝试使用LOAD DATA INFILE '/path/to/csv/file' INTO TABLE tablename CHARACTER SET UTF8 FIELDS TERMINATED BY '|' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';。完成需要几分钟(~20),但我会在准备好后立即回来。
【解决方案2】:

您的文件可能不是 UTF8。在您的编辑器中,保存时,检查文件的字符编码是否为 UTF8。编辑器正确呈现字符的事实并不意味着它被保存为 UTF8。字符编码是保存文件时的一个选项,或者是菜单中某处的文件属性(取决于编辑器)。

【讨论】:

  • 嗯。我使用 php 创建了文件,因为我正在将数据从 PostgreSQL 表传输到 MySQL 表。我会检查一下,然后返回结果。
  • 我再次用EditPlus打开了文件,现在字符也正确显示在那里,它说文件的编码是UTF8。所以我认为这不是问题:(
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 2017-03-15
  • 2011-03-26
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多