PHP和MySQL之间的字符集

时间:2015-12-25 09:45:21

标签: php mysql pdo

我现在有点困惑我与charset=utf8建立了PDO连接 并且数据库使用latin

这是什么意思?

我的想法是,这意味着由PHP发送或接收的每个连接都被编码为utf8。但是我读了很多,DB也应该使用与PHP相同的字符集。

任何人都可以详细解释字符集在PHP和MySQL数据库中的作用,以及对齐它们有什么好处?

1 个答案:

答案 0 :(得分:2)

假设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编码的字符,因此在人类可读字符中理解数字编码序列意味着Th以及e等没有问题。<登记/> 如果MySQL配置为使用latin1在some_table表中存储数据,当它接收到字符串时,它将字符从其UTF-8编码转换为latin1等值,然后再保存数据到硬盘 在这种情况下没有问题 - 因为英文字母字符可以用UTF-8和Latin1表示 但是,如果PHP发送的字符串包含只能由UTF-8而不是Latin1表示的字符,则会出现问题。聪明的报价。 当MySQL尝试将智能引用转换为数字形式时,它无法实现 - 因为Latin1字面上没有定义数字编码来表示
我不确定MySQL遇到这种情况时的确切错误管理流程是什么,以及情况是否可以恢复,但最终结果是底层编码会损坏且无法使用。
因为这个问题只发生在两个系统无法表示的那些字符上 - 如果你所有通信的99%都涉及英文字符,你可能不会注意到问题很长一段时间,即便如此,它只会是偶然的字符,但是当你注意到问题时试图恢复可能会令人沮丧。