我正在使用MySQL LOAD DATA INFILE Data
命令将数据批量插入表中。我是这样做的:
LOAD DATA INFILE 'MyFile.csv' INTO TABLE `dbname`.`tablename` FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' ;
当我从C#项目运行它时,我得到一个char(50)列的Data too long for column xxx
异常,它提供的数据小于50(但它是波斯语)但是当我使用时像SQLyog这样的MySql客户端工作正常。
以下是我运行此命令的方法:
private static void RunCommand(string command,params object[] args)
{
if (args != null)
command = string.Format(command, args);
using (var conn = MySqlClientFactory.Instance.CreateConnection())
{
if (conn == null) return;
conn.ConnectionString =
"Server=localhost;Uid=root;Pwd=123456; AutoEnlist=false;Charset=utf8;";
conn.Open();
using (var comm = conn.CreateCommand())
{
comm.CommandText = command;
comm.ExecuteNonQuery();
}
}
}
我想这可能是转换Unicode
个字符的问题,但我无法弄清楚如何让它正常运行。
答案 0 :(得分:1)
将CHARACTER SET utf8
参数添加到LOAD DATA INFILE...
语句:
LOAD DATA INFILE 'MyFile.csv'
INTO TABLE `dbname`.`tablename`
CHARACTER SET utf8
FIELDS TERMINATED BY '\t' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
如documentation中所述,它指定文件中使用的字符集:
character_set_database系统指示的字符集 变量用于解释文件中的信息。设置名称 而character_set_client的设置不影响解释 输入。如果输入文件的内容使用了一个字符集 与默认值不同,通常最好指定 使用CHARACTER SET子句的文件的字符集,即 自MySQL 5.1.17起可用。
如果未指定,则获取默认值,例如latin1
,并将每个utf-8
字节解释为字符。因为一些utf-8
个编码字符有多个字节,所以你会得到更长的字符串。