如何处理数据以避免MySQL“;“字符串值不正确”;错误?

如何处理数据以避免MySQL“;“字符串值不正确”;错误?,mysql,ruby-on-rails,ruby,encoding,character-encoding,Mysql,Ruby On Rails,Ruby,Encoding,Character Encoding,我试图使用Rake任务将一些遗留数据从MS-Access迁移到MySQL。我正在Windows XP上工作,使用Ruby 1.8.6 mysqli_escape_string() 我在database.yml中将Rails的编码设置为“utf8” mysqli_escape_string() 此外,MySQL的默认字符集是utf8 mysqli_escape_string() 99%的数据都很好,但我偶尔会得到一个列值,它会给我一个类似以下的错误: Mysql::Error: Incorr

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

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

mysqli_escape_string()
此外,MySQL的默认字符集是utf8

mysqli_escape_string()
99%的数据都很好,但我偶尔会得到一个列值,它会给我一个类似以下的错误:

Mysql::Error: Incorrect string value: '\x92 Comm...' for column 'name' 
  at row 1: 
  INSERT INTO `organizations` ( [...] ) 
  VALUES('Lawyers’ Committee', [...] )
mysqli_escape_string()
看起来,给MySQL带来麻烦的似乎是“律师”一词中紧跟“s”之后的撇号

mysqli_escape_string()
这是另一个

Mysql::Error: Incorrect string value: '\x99 aoc' for column 'department' 
  at row 1: 
  INSERT INTO `addresses` 
[...]
  'TRInfo™ aoc'
[....]
mysqli_escape_string()
看起来它被“TRInfo”后面的“TM”噎住了

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

mysqli_escape_string()
理想情况下,最好用更容易接受的字符替换它们——用单引号替换撇号,用字符串“(TM)”替换TM符号

mysqli_escape_string()

或者,如果我能以某种方式将MySQL配置为按原样存储这些字符而不出错,那也太好了。

看起来您的旧数据库是一种字符串格式(utf8?),而您的rails需要其他格式。如果您的输入是utf8格式,您是否尝试过

看起来您的输入数据不是utf-8格式

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

mysqli_escape_string()

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

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

mysqli_escape_string()

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

通常,在向编码/排序不兼容的列插入字符串时会发生这种情况

mysqli_escape_string()
我在使用触发器时遇到了这个错误,由于某种原因,触发器继承了服务器的排序规则。 mysql的默认值是(至少在Ubuntu上)拉丁文-1,带有瑞典语排序规则。 尽管我已经将数据库和所有表设置为UTF-8,但我还没有将my.cnf设置为

mysqli_escape_string()
/etc/mysql/my.cnf:

[mysqld]
character-set-server=utf8
default-character-set=utf8
mysqli_escape_string()
这必须列出所有带utf8-*的触发器:

select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS
mysqli_escape_string()
其中列出的一些变量也应具有utf-8-*(无拉丁语-1或其他编码):

mysqli_escape_string()
我今天遇到了同样的问题。 经过多次尝试,我终于找到了原因并修复了它。 对于使用默认MySQL字符集和排序规则(latin1、latin1_swedish_ci)存储数据的应用程序,因此在创建数据库或表时,需要将字符集和排序规则指定为utf8/utf8_general_ci。 例如。: $sql=“创建表”$表格名称。" ( id mediumint(9)非空自动增量, bookname varchar(128)不为空, 作者varchar(64)不为空, 主键(id), 键(书名) )字符集utf8校对utf8_常规_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 希望这能对你有所帮助。
在古怪列之前添加二进制可以解决问题

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

mysqli_escape_string()
在深入研究之后,我通过在字符串列名之前添加二进制,或者使用cast(weirdcolumn作为二进制)找到了解决方案

mysqli_escape_string()

希望这能有所帮助。

我在使用Php将数据从SQL Server导入MySql时遇到了同样的问题。
mysqli_escape_string()
我的解决方案是插入MySql时使用
utf8\u encode()
,从MySql检索时使用
utf8\u 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()
请注意:对于新项目,请使用

mysqli_escape_string()

谢谢,所有设置都设置为utf8。此解决方案不回答OP问题“是否有任何方法…”
mysqli_escape_string()