PHP和MySQL之间的字符集

8

我现在有一个带有charset=utf8的PDO连接,但是数据库使用的是latin

这是什么意思呢?

我的想法是,这意味着PHP建立的每个与数据库的连接都被编码为utf8。然而,我读到很多文章说,数据库也应该使用与PHP相同的字符集。

请问有人可以详细解释一下PHP和MySQL数据库中字符集的作用以及将它们对齐的好处吗?


很多。最多的是外语。如果您感兴趣,请阅读此链接:http://htmlpurifier.org/docs/enduser-utf8.html#whyutf8 - devpro
1个回答

2

假设PHP向MySQL发送要存储的文本,类似于以下内容:

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

这个查询的基本意图显然是告诉MySQL将字符串The quick brown fox jumps over the lazy dog存储到数据库中。
如果PHP配置为使用UTF-8,那么当它将可读字符转换为二进制以便传输给MySQL时,它将使用UTF-8编码系统来转换这些字符。MySQL可以读取UTF-8编码的字符,因此它没有问题理解数字编码序列的含义,比如T和h和e等人类可读的字符。如果MySQL配置为使用latin1在some_table表中存储数据,那么当它接收到字符串时,它将在将数据保存到硬盘之前将字符从其UTF-8编码转换为latin1的等效字符。在这种情况下,没有问题,因为英文字母字符可以由UTF-8和Latin1表示。然而,如果PHP发送的字符串包含只能由UTF-8而不是Latin1表示的字符,例如智能引号“,则会出现问题。当MySQL尝试将智能引号“转换为数字形式时,它将无法做到,因为Latin1没有定义任何数字编码来表示“。我不确定MySQL遇到这种情况时的确切错误管理过程以及该情况是否可恢复,但通常最终结果是底层编码将损坏且无法使用。由于此问题仅发生在不能由两个系统表示的字符上,如果你99%的通信都涉及英文字符,你可能不会注意到问题很长一段时间,即使你注意到了问题,它也只是偶尔出现,但在尝试恢复时可能会令人沮丧。

这太棒了,解释得非常好,谢谢。但我想问一下,如果我在 PHP 中使用 utf8,即使我试图在具有近20列和2000行的数据库中提高性能,是否建议我也在 MySQL 中使用相同的编码方式?而且目前我只使用英语(可能会在将来更改)。 - Sameh
很好。我无法想象为什么切换MySQL会导致性能问题,特别是对于这么小的数据库。但如果你真的很担心,你可以设置一个数据库,并使用旧的和新的MySQL字符集来计时查询。我的理解是,当MySQL发布v6.0时,UTF-8将成为默认字符集。 - the_velour_fog
切换不会造成问题,查询本身会变慢。我理解UTF8比Latin占用更多的空间,使查询变慢,请纠正我如果我错了,并给出您关于我的情况的最终建议。我知道数据库很小,但我在运行最小资源,所以我不需要抽取所有杯子能量去查询。 - Sameh
如果您担心性能问题,请设置新的字符集并测量运行复杂查询所需的时间。在您的PHP中使用microtime(true);设置一个时间戳,运行查询,然后设置另一个时间戳并测量差异。更多信息请参见:https://dev59.com/k2435IYBdhLWcg3wtCSQ#5267918。 - the_velour_fog
非常感谢,我比较了一些查询,它们的速度几乎相同,所以我转换为 utf8mb4。 - Sameh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接