【问题标题】:Using "LOAD DATA LOCAL INFILE" to load csv file that contains Accented Characters使用“LOAD DATA LOCAL INFILE”加载包含重音字符的 csv 文件
【发布时间】:2017-04-12 14:01:31
【问题描述】:

我正在使用 JDBC 执行查询“LOAD DATA LOCAL INFILE”以将 csv 文件加载到 mysql 表中。

csv 文件包含重音字符,例如 ä,ö,ü,ß。

我的问题是德语字符无法通过 JDBC 或终端执行查询“LOAD DATA LOCAL INFILE”插入到 mysql 表中;但是,我可以通过执行“INSERT”或“UPDATE”语句来插入德语字符。

我一直在尝试各种不同的方法来弄清楚如下,但仍然无法工作:

对于 JDBC 连接我做了:

jdbc:mysql://${sequence.db.svr}/seq?  connectTimeout=20000&useUnicode=yes&characterEncoding=utf8

对于“加载数据本地文件”我做了:

LOAD DATA LOCAL INFILE fileName 
INTO TABLE tableName 
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
ENCLOSED BY '"';



String query = "LOAD DATA LOCAL INFILE '" + fileName +
            "' INTO TABLE pde." + table +
            " CHARACTER SET UTF8" +
            "  FIELDS TERMINATED BY ','" +
            " ENCLOSED BY '\"'" 
            + ";";

对于mysql数据库属性我做了:

ALTER DATABASE databaseName CHARACTER SET utf8 COLLATE utf8_unicode_ci;

对于mysql表属性我做了:

ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

创建表查询:

CREATE TABLE `testTable` (
  `value` varchar(255) DEFAULT NULL,
  `mapped_value` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

创建数据库查询:

CREATE DATABASE `testDatabase` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */

CSV 文件:

amÜ,amman
amàn,amman

十六进制的CSV文件:

616d dc2c 616d 6d61 6e0a 616d e06e 2c61 6d6d 616e 0a

【问题讨论】:

  • 1) 在开头使用这个:SET CHARACTER SET 'utf8'; SET collation_connection = 'utf8_general_ci'2) 检查您的输入文件是否以正确的编码创建(使用encafile -i)
  • @Alfabravo 你是对的。我的 csv 文件的编码不正确。我通过将 csv 文件编码更改为 utf8 来修复此错误。谢谢!

标签: mysql jdbc load-data-infile


【解决方案1】:

在我看来,您的 CSV 文件是用 Latin-1 (ISO 8859-1) 而不是 utf-8 编码的。我怎么知道?

 a  m   Ü  ,   a  m   m  a   n  \n    a  m   à  n   ,  a   m  m   a  n   \n

61 6d  dc 2c  61 6d  6d 61  6e 0a    61 6d  e0 6e  2c 61  6d 6d  61 6e   0a

看看 Ü 是如何只用一个字节编码的,dc?那是拉丁语1。如果它是 utf-8 格式,它将改为由 c39c 编码。

因此将LOAD DATA INFILE 命令中的CHARACTER SET UTF8 更改为CHARACTER SET latin1,然后重试。

【讨论】:

  • 谢谢!你说的对。我的 csv 文件的编码不正确。我通过将 csv 文件编码更改为 utf8 来修复此错误。谢谢!
  • 喜欢这个解释来推断编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
相关资源
最近更新 更多