使用 "LOAD DATA LOCAL INFILE" 加载包含重音字符的 csv 文件

Using "LOAD DATA LOCAL INFILE" to load csv file that contains Accented Characters

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

csv 文件包含 ä、ö、ü、ß 等重音字符。

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

我一直在尝试各种不同的方法,如下所示,但仍然无法工作:

对于 JDBC 连接,我做了:

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

对于 "LOAD DATA LOCAL INFILE" 我做了:

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;

对于mysqltable属性我做了:

ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

创建 table 查询:

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

在我看来,您的 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?那是 Latin-1。如果它在 utf-8 中,它将被 c39c 编码。

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