【问题标题】:MySQL LOAD DATA INFILE Data too long for column exceptionMySQL LOAD DATA INFILE 数据太长导致列异常
【发布时间】:2014-08-21 10:39:21
【问题描述】:

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

【问题讨论】:

  • 尝试在LOAD DATA INFILE...语句中添加CHARACTER SET utf8参数。

标签: c# mysql bulkinsert


【解决方案1】:

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';

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

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

如果未指定,则获取默认值,例如 latin1 并且每个 utf-8 字节被解释为字符。因为某些utf-8 编码的字符超过一个字节,所以字符串会更长。

【讨论】:

  • 谢谢 :) 看来我太着急以至于错过了显而易见的事情。
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多