我在向数据库插入行时遇到问题。 当一行包含如下字符:'è','ò','ò','€','²','³'等等...它会返回一个这样的错误(charset设置为 UTF8 ):
Incorrect string value: '\xE8 pass...' for column 'descrizione' at row 1 - INSERT INTO materiali.listino (codice,costruttore,descrizione,famiglia) VALUES ('E 251-230','Abb','Relè passo passo','Relè');
但是,如果我将charset设置为 latin1 或* utf8_general_ci *它可以正常工作,并且没有找到错误。
有人可以解释一下为什么会这样吗?我一直认为 utf8 比 latin1 “更大”
编辑:我也尝试使用mysql_real_escape_string,但错误总是一样!!!!答案 0 :(得分:5)
mysql_real_escape_string()
不相关,因为它只会转义字符串终止引号,否则会使攻击者能够注入SQL。
utf8
确实比latin1
“更大”,因为它能够代表后者角色的超集。但是,并非每个字节序列都代表有效的utf8
个字符;而每个可能的字节序列都代表有效的latin1
个字符。
因此,如果MySQL收到一个字节序列,它预期为utf8
(但不是),某些字符很可能会触发这个“错误的字符串值”错误;而如果它希望字节为latin1
(即使它们不是),它们也会被接受 - 但不正确的数据可能会存储在表格中。
您的问题几乎可以肯定,您的连接字符集与应用程序发送其字符串的编码不匹配。使用SET NAMES
语句更改当前连接的字符集,例如SET NAMES 'utf8'
如果您的应用程序正在发送编码为UTF-8的字符串。
了解更多信息,请阅读connection character sets。
另外,utf8_general_ci
不是字符集:它是utf8
字符集的校对。 The manual解释说:
字符集 是一组符号和编码。 归类 是一组用于比较字符集中字符的规则。
答案 1 :(得分:3)
根据UTF-8的doc,默认排序规则为utf8_general_ci
。
如果您希望字母表中的特定订单不是general_ci
,则应选择为utf8_*
字符集提供的utf8
归类之一,以符合您的要求为准订购。
您的表格和与DB的连接都应以utf8
进行编码,最好是相同的排序规则,read more about setting connection collation。
为了完全安全,您应该检查表格排序,并确保它的utf8_*
以及您的连接也是如此,使用 SET NAMES的完整语法强>
SET NAMES 'utf8' COLLATE 'utf8_general_ci'
您可以找到有关不同排序规则here
的信息答案 2 :(得分:0)
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
Eurika,上面做了: - )