MySQL LOAD DATA INFILE数据太长导致列异常

本文关键字:致列 异常 数据 LOAD DATA INFILE MySQL | 更新日期: 2023-09-27 18:19:00

我使用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(但它是波斯语),但当我使用MySql客户端如SQLyog时,它工作正常。

我是这样运行这个命令的:

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字符的问题,但我不知道如何使其正确运行。

MySQL LOAD DATA INFILE数据太长导致列异常

LOAD DATA INFILE...语句添加CHARACTER SET utf8参数:

LOAD DATA INFILE 'MyFile.csv'
 INTO TABLE `dbname`.`tablename`
 CHARACTER SET utf8
 FIELDS TERMINATED BY ''t' ENCLOSED BY '"'
 LINES TERMINATED BY ''r'n';

如文档中所述,它指定文件中使用的字符集:

character_set_database系统指示的字符集变量用于解释文件中的信息。组名称并且character_set_client的设置不影响解释的输入。如果输入文件的内容使用的字符集为与默认值不同,通常最好指定通过使用character set子句来设置文件的字符集,即

如果未指定,则获取默认值,例如latin1,并且每个utf-8字节都被解释为字符。因为一些utf-8编码字符有一个以上的字节,所以你得到了更长的字符串。