【问题标题】:character set between PHP and MySQLPHP 和 MySQL 之间的字符集
【发布时间】:2016-03-31 10:18:31
【问题描述】:

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

这是什么意思?

我的想法是这意味着 PHP 完成的每个连接(无论是从数据库发送还是接收)都被编码为 utf8。但是我读了很多,数据库也应该使用与 PHP 相同的字符集。

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

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

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

【讨论】:

  • 这太棒了,它解释了非常感谢。但想问你,如果我在 php 中使用 utf8,是否建议我在 MySQL 中使用相同的方法,即使我正在尝试使用具有近 20 列和 2000 行的数据库来节省性能。同时我只使用英语(将来可能会改变)
  • 酷。我无法想象为什么切换 MySQL 会导致性能问题,尤其是对于这么小的数据库。但是,如果您担心,您可以随时设置数据库并使用新旧 MySQL 字符集对查询进行计时。我的理解是,当 MySQL 发布 v6.0 UTF-8 时,默认字符集无论如何都会向前发展
  • 切换不会导致查询本身会变慢。我的理解是 UTF8 比拉丁文占用更多空间,因此查询速度较慢,如果我错了,请更正,并就我的情况给我你的最终建议我知道数据库很小,但我运行的资源很少,所以我不需要把所有的精力都花在查询上。
  • 如果您担心性能,请设置新字符集并测量运行复杂查询所需的时间。在您的 PHP 中使用microtime(true); 设置一个时间戳运行您的查询,然后设置另一个时间戳并测量差异。更多信息请参考:stackoverflow.com/a/5267918/4668401>
  • 非常感谢,我比较了一些查询,它们的速度几乎相同,因此 k 转换为 utf8mb4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2012-10-17
  • 1970-01-01
  • 2012-09-02
  • 2014-03-24
  • 1970-01-01
相关资源
最近更新 更多