utf8和utf8_general_ci

Yur*_*uri 1 mysql character-encoding

我在向数据库插入行时遇到问题.当一行包含如下字符:'è','ò','ò','€','²','³'等等...它会返回一个错误(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è');
Run Code Online (Sandbox Code Playgroud)

但是,如果我将charset设置为latin1或*utf8_general_ci*它工作正常,并且没有找到错误.

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

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

egg*_*yal 5

mysql_real_escape_string() 是不相关的,因为它只是逃避字符串终止引号,否则将使攻击者能够注入SQL.

utf8确实"更大" latin1,因为它能够代表后者角色的超集.但是,并非每个字节序列都代表有效utf8字符; 而每个可能的字节序列都代表有效latin1字符.

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

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

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

顺便说一句,utf8_general_ci是不是字符集:这是一个整理utf8字符集.手册解释说:

字符集是一组符号和编码.甲归类为在一个字符集的字符进行比较的一组规则.