【问题标题】:MySQL Load data infile UTF8 encodingMySQL Load data infile UTF8 编码
【发布时间】:2018-02-08 13:46:50
【问题描述】:

我正在尝试将数据从 utf8 编码的文本文件插入到 utf8 编码的 mysql 数据库中。

我尝试插入的文本文件中的一行如下所示:

<http://dbpedia.org/resource/Canada_(New_France)> <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:History_of_Canada_(1534–1763)> .

要将文件加载到数据库中,我使用以下命令:

LOAD DATA LOCAL INFILE 'path/to/file'
INTO TABLE table_name
CHARACTER SET utf8
FIELDS TERMINATED BY ' '
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(s, @p, o)
COMMIT;

创建表命令如下所示:

 CREATE TABLE `article_categories3` (`s` varchar(511) NOT NULL, `o` varchar(511) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8

不幸的是,数据库中的结果条目如下所示:

| <http://dbpedia.org/resource/Canada_(New_France)>       | <http://dbpedia.org/resource/Category:History_of_Canada_(1534û1763)> |

'-' 被 'û' 取代。 其他特殊字符也是如此,例如 'ï' 被替换为 '´'。

mysql 显示这些字符集:

Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
character_set_results: latin1

使用命令 \C utf8 将客户端和连接字符集和 character_set_results 更改为 utf8 会导致:

<http://dbpedia.org/resource/Category:History_of_Canada_(1534ÔÇô1763)>
<http://dbpedia.org/resource/Category:Oïl_languages>

将它们更改为 cp850 会导致:

<http://dbpedia.org/resource/Category:History_of_Canada_(1534?1763)>
<http://dbpedia.org/resource/Category:Oïl_languages>

因此,使用此设置 'ï' 显示正确。

我还尝试编写一个小 java 程序,将文件中的行插入到数据库中,但我使用这种方法遇到了相同的结果。

但是如果我在 mysql-console 中手动输入插入命令,它会被正确插入:

 INSERT INTO table_name VALUES ('<http://dbpedia.org/resource/Canada_(New_France)>', '<http://dbpedia.org/resource/Category:History_of_Canada_(1534–1763)>');

条目的十六进制代码是:

3C687474703A2F2F646270656469612E6F72672F7265736F757263652F43617465676F72793A486973746F72795F6F665F43616E6164615F2831353334E2809331373633293E

(在这里结束E28093

3C687474703A2F2F646270656469612E6F72672F7265736F757263652F43617465676F72793A4FC3AF6C5F6C616E6775616765733E

我像这样检查了文本文件的编码:

file -i test.ttl
test.ttl: text/plain; charset=utf-8

你有什么想法,我还能尝试用正确的编码将文件加载到数据库中吗?

【问题讨论】:

  • 获取该列的HEX() -- û 是十六进制的C3BB; endash 和 emdash 在 utf8 中是 E28093E28094。其他事情正在发生。此外,ï´ 没有直接映射。 (所以,发生了什么并不明显;HEX 应该会有所帮助。)

标签: mysql utf-8 character-encoding


【解决方案1】:

您似乎在数据流中的某处有字符集cp850

请提供

  • SHOW CREATE TABLE
  • 连接 MySQL 时的连接参数。

还要验证传入的数据是否实际编码为UTF-8

获取该列的HEX() -- û 是十六进制的C3BB; endash 和 emdash 在 utf8 中是 E28093E28094。正在发生其他事情。

更多

所有三个都需要设置为相同:character_set_clientcharacter_set_connectioncharacter_set_results

【讨论】:

  • 我将信息添加到我的问题中。将客户端连接设置为 cp850 ï 显示正确,但 - 仍然显示错误。
  • character_set_results 也是。一个成功一个失败是巧合。这是因为 cp850 与 latin1 有一些重叠。
  • character_set_results 设置为 latin1。通过使用命令\C utf8 更改连接字符集,它也会更改为utf8
  • 未来一瞥:MySQL 8.0 一路默认为utf8mb4。 (latin1 主要用于遗留 MySQL 数据;cp850 和许多其他编码仅用于读取其他遗留数据——目的是快速转向 UTF-8。)
猜你喜欢
  • 2012-10-05
  • 2010-11-17
  • 1970-01-01
  • 2017-07-21
  • 2012-06-01
  • 2011-09-01
  • 1970-01-01
  • 2020-07-25
相关资源
最近更新 更多