PHP和MySQL之间的字符集

PHP和MySQL之间的字符集,php,mysql,pdo,Php,Mysql,Pdo,我现在有点困惑,我有一个与charset=utf8 数据库使用拉丁语 这是什么意思 我的想法是,这意味着PHP从DB发送或接收的每个连接都被编码为utf8。然而,我读了很多关于DB也应该使用与PHP相同的字符集的文章 谁能详细解释一下字符集在PHP和MySQL数据库中的作用,以及将它们对齐的好处是什么 假设PHP发送一些文本到MySQL进行存储,比如 INSERT INTO `some_table` ("foo") VALUES ('The quick brown fox jumps over

我现在有点困惑,我有一个与
charset=utf8
数据库使用
拉丁语

这是什么意思

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


谁能详细解释一下字符集在PHP和MySQL数据库中的作用,以及将它们对齐的好处是什么

假设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编码的字符,因此理解数字编码的序列意味着人类可读字符中的
T
h
e
等是没有问题的。
如果MySQL被配置为使用拉丁语1将数据存储在
some\u表中,当它接收到字符串时,它将在将数据保存到硬盘之前将字符从UTF-8编码转换为拉丁语等价物。
在这种情况下没有问题,因为英文字母可以用UTF-8和拉丁文1表示。
但是,如果PHP发送的字符串包含只能用UTF-8而不能用拉丁语1表示的字符,例如智能引号
,则会出现问题。 当MySQL试图将智能引号
转换为数字形式时,它将无法-因为Latin1实际上没有定义数字编码来表示

我不确定MySQL遇到这种情况时的确切错误管理过程是什么,以及这种情况是否可以恢复,但通常情况下,最终结果是底层编码将损坏且无法使用。

因为这个问题只发生在两个系统无法表示的字符上——如果99%的通信都涉及英语字符,那么你可能会在相当长的一段时间内没有注意到问题,甚至只是偶尔出现的字符,但是当你注意到问题时试图恢复可能会令人沮丧。

很多。最流行的一种外语。如果你对此感兴趣的话,这是非常棒的,它解释了很多,谢谢。但是我想问你,如果我在php中使用utf8,建议我在MySQL中使用同样的方法,尽管我试图用一个近20列2000行的数据库来节省性能。同时我只使用英语(将来可能会改变)酷。我无法想象为什么切换MySQL会导致性能问题,尤其是对于这么小的数据库。但是如果你担心的话,你可以设置一个数据库,用新旧的MySQL字符集计时查询。我的理解是,当MySQL版本6.0 UTF-8将默认字符集向前移动时,切换不会导致性能问题我的理解是UTF8比拉丁语占用更多的空间,使查询速度变慢。如果我错了,请纠正,并给我关于我的情况的最后建议。我知道数据库很小,但我使用的资源很少,所以我不需要将所有的cup功能用于查询。如果你担心为了提高性能,设置新的字符集并测量运行复杂查询所需的时间;
运行查询,然后设置另一个时间戳并测量差异。有关更多信息,请参阅:非常感谢,我比较了一些查询,它们的速度几乎相同,因此k转换为utf8mb4。