1

我在向我的数据库插入行时遇到问题。当一行包含以下字符时:'è'、'ò'、'ò'、'€'、'²'、'³' .... 等...它会返回这样的错误(字符集设置为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è');

但是,如果我将字符集设置为latin1或 *utf8_general_ci* 它工作正常,并且没有发现错误。

有人可以解释一下为什么会这样吗?我一直认为utf8latin1 “大”

编辑:我也尝试使用 mysql_real_escape_string,但错误总是一样的!!!

4

3 回答 3

5

mysql_real_escape_string()不相关,因为它只是转义了字符串终止引号,否则攻击者可以注入 SQL。

utf8确实比它“更大” latin1,因为它能够表示后者字符的超集。然而,并不是每个字节序列都代表有效utf8字符。而每个可能的字节序列都代表有效latin1字符。

因此,如果 MySQL 接收到它期望的字节序列utf8(但事实并非如此),某些字符很可能会触发这个“不正确的字符串值”错误;而如果它期望字节是latin1(即使它们不是),它们将被接受 - 但不正确的数据可能存储在表中。

您的问题几乎可以肯定是您的连接字符集与您的应用程序发送其字符串的编码不匹配。使用该SET NAMES语句更改当前连接的字符集,例如,SET NAMES 'utf8'如果您的应用程序正在发送编码为 UTF-8 的字符串。

阅读有关连接字符集的更多信息。

顺便说一句,utf8_general_ci不是字符集:它是字符集的排序规则utf8手册解释:

字符集是一组符号和编码。排序规则是一组用于比较字符集中的字符的规则。

于 2012-05-15T08:58:47.963 回答
3

根据 UTF-8 的文档,默认排序规则是utf8_general_ci. 如果您想要字母表中的特定顺序不是那个顺序general_ci,您应该选择utf8_*为字符集提供的排序规则之一utf8,以符合您在排序方面的要求为准。

您的表和与数据库的连接都应该被编码utf8,最好是相同的排序规则,阅读更多关于设置连接排序规则

为了完全安全,您应该使用SET NAMES的完整语法检查您的表排序规则并确保它是utf8_*并且您的连接也是

SET NAMES 'utf8' COLLATE 'utf8_general_ci'

您可以在此处找到有关不同排序规则的信息

于 2012-05-15T09:03:18.727 回答
1
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");

尤里卡,上面做到了:-)

于 2013-10-15T02:06:14.777 回答