MySQL LOAD DATA INFILE数据对于列异常来说太长了

时间:2014-08-21 10:39:21

标签: c# mysql bulkinsert

我正在使用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个字符的问题,但我无法弄清楚如何让它正常运行。

1 个答案:

答案 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个编码字符有多个字节,所以你会得到更长的字符串。