PHP和MySQL之间的字符集


character set between PHP and MySQL

我现在有点困惑我与charset=utf8有PDO连接并且DB使用CCD_ 2。

这是什么意思?

我的想法是,这意味着PHP完成的每个连接,无论是从DB发送还是接收,都被编码为utf8。然而,我读了很多关于DB也应该使用与PHP相同的字符集的文章。

有人能详细解释一下字符集在PHP和MySQL DB中的作用吗?对齐它们有什么好处?

假设PHP向MySQL发送一些文本以进行存储,类似

INSERT INTO `some_table` ("foo") VALUES 
('The quick brown fox jumps over the lazy dog');

这个查询的基本目的显然是告诉MySQL存储字符串快速的棕色狐狸跳过懒惰的狗进入数据库。

如果PHP被配置为使用UTF-8,这意味着当它将人类可读的字符转换为二进制时——为了将其传输到MySQL——它将使用UTF-8编码系统转换字符
MySQL可以读取UTF-8编码的字符,因此理解数字编码序列在人类可读字符中意味着The等是没有问题的
如果MySQL被配置为使用latin1在some_table表中存储数据,当它接收到字符串时,它将在将数据保存到硬盘之前,将字符从UTF-8编码转换为等效的latin1
在这种情况下没有问题,因为英语字母字符可以用UTF-8和Latin1表示。
但是,如果PHP发送的字符串包含只能用UTF-8表示而不能用Latin1表示的字符,例如智能引号,就会出现问题。当MySQL试图将智能引号转换为数字形式时,它将无法转换,因为Latin1实际上没有定义数字编码来表示
当MySQL遇到这种情况时,我不确定它的确切错误管理过程是什么,也不确定这种情况是否可以恢复,但通常最终的结果是底层编码会损坏和不可用
因为这个问题只发生在那些无法用这两个系统表示的字符上——如果你99%的通信都涉及英文字符,你可能在很长一段时间内都没有注意到问题,即使这样也只是偶尔出现的字符,但当你注意到问题时,试图恢复可能会令人沮丧。