PHP和MySQL之间的字符集

Sam*_*meh 8 php mysql pdo

我现在有点困惑,我有一个PDO连接charset=utf8 和DB使用latin.

这是什么意思 ?

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

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

the*_*fog 2

假设 PHP 发送一些文本到 MySQL 进行存储,比如

\n\n
INSERT INTO `some_table` ("foo") VALUES \n(\'The quick brown fox jumps over the lazy dog\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个查询的基本意图显然是告诉 MySQL 将字符串The Quick Brown Fox Jumps Over the Lazy Dog存储到数据库中。

\n\n

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

\xe2\x80\x9c\xe2\x80\x9c\xe2\x80\x9c

\n