如何处理数据以避免MySQL“错误的字符串值”错误?

我正在尝试使用Rake任务将一些遗留数据从MS Access迁移到MySQL。 我正在使用Ruby 1.8.6开发Windows XP。

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

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

99%的数据都很好,但是我偶尔会得到一个列值,它会给我一个像这样的错误:

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

看起来给MySQL带来麻烦的事情就是“律师”一词中的“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以按原样存储这些字符而不会出现错误。

看起来你的输入数据不是utf-8。

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

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

将UTF-16编码文件的内容(通常每16位块存储一个字符)放入带有java的mysql表时,我遇到了同样的问题。 问题是UTF-16编码的字符串包含所谓的代理对 。 这意味着两个连续的16位UTF-16块编码一个特殊字符,但无法单独转换为相应的UTF-8编码。 有关详细说明,请参阅维基百科 。

解决方案是简单地用空格替换这些字符。 这是您可能想要从字符串中删除的字符范围:U + D800-U + DFFF

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

当我有TRIGGER时出现这个错误,TRIGGER由于某种原因inheritance了服务器的排序规则。 并且mysql的默认值是(至少在Ubuntu上)latin-1和swedish collat​​ion。 即使我有数据库和所有表设置为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%'; 

看起来你的旧数据库是一种字符串格式(utf8?),你的rails期待别的东西。 如果您输入的是utf8,您是否尝试过配置rails以支持它?

我今天遇到了同样的问题。
经过多次尝试,我找到了原因并最终解决了。
对于使用默认MySQL字符集和排序规则(latin1,latin1_swedish_ci)存储数据的应用程序,因此在创建数据库或表时需要为utf8 / utf8_general_ci指定字符集和排序规则。
例如:
         $ sql =“CREATE TABLE”。  $ table_name。  “(
         id mediumint(9)NOT NULL AUTO_INCREMENT,
         bookname varchar(128)NOT NULL,
         author varchar(64)NOT NULL,
         PRIMARY KEY(id),
         KEY(书名)
         )CHARACTER SET utf8 COLLATE 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

希望这可以帮助你。

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

在我的例子中,我在tableA上有一个更新触发器,用于将数据插入到其他表中。 列奇怪列中有一些特殊字符,更新失败并显示消息:“ERROR 1366(HY000):字符串值不正确:’\ xE7 ….’”

经过深入挖掘后,我通过在字符串列名之前添加二进制文件或使用强制转换(weirdcolumn as binary)找到了解决方案;

希望这可以提供帮助。

我有同样的问题使用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() 

链接