【问题标题】:How can I process data to avoid MySQL "incorrect string value" error?如何处理数据以避免 MySQL“不正确的字符串值”错误?
【发布时间】:2009-06-04 00:17:14
【问题描述】:

我正在尝试使用 Rake 任务将一些旧数据从 MS Access 迁移到 MySQL。我正在使用 Ruby 1.8.6 在 Windows XP 上工作。

我在database.yml 中将 Rails 的编码设置为“utf8”。

另外,MySQL 的默认字符集是 utf8。

99% 的数据正常,但我会时不时地得到一个列值,它会给我这样的错误:

Mysql::Error: Incorrect string value: '\x92 Comm...' for column 'name' 
  at row 1: 
  INSERT INTO `organizations` ( [...] ) 
  VALUES('Lawyers’ Committee', [...] )

看起来给 MySQL 带来麻烦的东西是紧跟在“Lawyers”一词中的“s”之后的撇号。

还有一个……

Mysql::Error: Incorrect string value: '\x99 aoc' for column 'department' 
  at row 1: 
  INSERT INTO `addresses` 
[...]
  'TRInfo™ aoc'
[....]

看起来它在“TRInfo”之后的“TM”上卡住了。

是否有任何 Ruby 或 Rails 方法可以让我通过运行数据来清除 MySQL 会阻塞的任何字符?

理想情况下,最好将它们替换为更可口的字符 - 将撇号替换为单引号,将 TM 符号替换为字符串“(TM)”。

或者,如果我能以某种方式配置 MySQL 以按原样存储这些字符而不会出现错误,那也很棒。

【问题讨论】:

    标签: mysql ruby-on-rails ruby encoding character-encoding


    【解决方案1】:

    您的输入数据似乎不是 utf-8 格式。

    我做了一些调查,在 Lawyer's 中使用的样式引用在 Windows-1252 编码中被编码为 \x92,但对于 utf-8 来说是无意义的(当我将其解码并将其编码为 utf8 时,我得到了 \xe2 \x80\x99)。

    因此,您需要将输入字符串从 windows-1252 转换为 utf-8(或 unicode)。

    【讨论】:

    • 此解决方案不回答 OP 问题“有什么方法...”
    【解决方案2】:

    将 UTF-16 编码文件的内容(通常每个 16 位块存储一个字符)放入 mysql 表时,我遇到了同样的问题。问题在于 UTF-16 编码的字符串包含所谓的代理对。这意味着两个连续的 16 位 UTF-16 块编码一个特殊字符,但不能单独转换为相应的 UTF-8 编码。更多解释见wikipedia

    解决方案是简单地将这些字符替换为空格。这是您可能希望从字符串中删除的字符范围:U+D800–U+DFFF

    【讨论】:

      【解决方案3】:

      通常,当您将字符串插入编码/排序规则不兼容的列时,会发生这种情况。

      当我有 TRIGGER 时出现此错误,由于某种原因它继承了服务器的排序规则。 mysql 的默认值是(至少在 Ubuntu 上)带有瑞典排序规则的 latin-1。 即使我将数据库和所有表都设置为 UTF-8,我还没有设置 my.cnf:

      /etc/mysql/my.cnf:

      [mysqld]
      character-set-server=utf8
      default-character-set=utf8
      

      这必须列出所有带有 utf8-* 的触发器:

      select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS
      

      这里列出的一些变量也应该有 utf-8-*(没有 latin-1 或其他编码):

      show variables like 'char%';
      

      【讨论】:

        【解决方案4】:

        看起来您的旧数据库是一种字符串格式(utf8?),而您的 rails 正在期待其他的东西。如果你输入的是utf8,你试过configuring your rails to support it?

        【讨论】:

        • 谢谢,一切都设置为 utf8。
        【解决方案5】:
        我今天遇到了同样的问题。 经过多次尝试,我终于找到了原因并修复了它。 对于使用默认 MySQL 字符集和排序规则(latin1、latin1_swedish_ci)存储数据的应用程序,因此您需要在创建数据库或表时将字符集和排序规则指定为 utf8/utf8_general_ci。 例如。: $sql = "创建表" 。 $table_name 。 " ( id mediumint(9) NOT NULL AUTO_INCREMENT, 书名 varchar(128) NOT NULL, 作者 varchar(64) NOT NULL, 主键(id), KEY(书名) )字符集 utf8 整理 utf8_general_ci;"; 参考: 《mysql建表问题?解决了!!!!!!!!!!!” http://forums.mysql.com/read.php?121,193883,193883 《10.1.5.为应用程序配置字符集和排序规则》 http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html 希望这可以帮助你。

        【讨论】:

          【解决方案6】:

          在奇怪的列之前添加二进制可以解决问题。

          在我的例子中,我在 tableA 上有一个更新触发器,可以将数据插入到其他表中。 列怪异列中有一些特殊字符,更新失败并显示消息:“ERROR 1366 (HY000): Incorrect string value: '\xE7....'”

          我挖了很多,找到了解决办法,方法是在字符串列名前加binary,或者使用cast(weirdcolumn as binary);

          希望这能有所帮助。

          【讨论】:

            【解决方案7】:

            我在使用 PHP 将数据从 SQL Server 导入 MySql 时遇到了同样的问题。 我的解决方案是在插入 MySql 时使用utf8_encode(),并在从 MySql 检索以显示到浏览器时使用 utf8_decode()。 这里有我的完整代码,效果很好。

            //For string values
            $Gro2=(is_null($row["GrpNm"]))?"NULL":"\"".mysql_escape_string(utf8_encode($row["GrpNm"]))."\"";
            
            
            $sqlMy ="INSERT INTO `tbl_name` VALUES ($Gro2)";
            

            请注意:对于新项目使用

            mysqli_escape_string()
            

            link

            【讨论】:

              猜你喜欢
              • 2020-06-21
              • 2012-09-20
              • 1970-01-01
              • 2013-10-10
              • 1970-01-01
              • 2017-01-17
              • 1970-01-01
              • 2012-02-01
              • 2012-11-08
              相关资源
              最近更新 更多