将 utf8mb4 与 php 和 mysql 结合使用

2022-08-30 16:28:47

我已经读到mysql >= 5.5.3完全支持所有可能的字符,如果你使用编码utf8mb4的某个表/列 http://mathiasbynens.be/notes/mysql-utf8mb4

看起来不错。只有我注意到php中的mb_functions没有!我在列表中的任何地方都找不到它:http://php.net/manual/en/mbstring.supported-encodings.php

我不仅读了东西,还做了一个测试。

我使用php脚本将数据添加到mysql utf8mb4表中,其中内部编码设置为UTF-8:mb_internal_encoding("UTF-8");

而且,正如预期的那样,字符在数据库中看起来很混乱。

任何想法,我如何使php和mysql使用相同的编码(可能是4字节的编码),并且仍然完全支持任何世界语言?

另外,为什么utf8mb4与utf32不同?


答案 1

MySQL的编码不是实际的UTF-8。这是一种有点像 UTF-8 的编码,但只支持 UTF-8 支持的子集。 是实际的 UTF-8。这种差异是MySQL的内部实现细节。两者在PHP方面看起来都像UTF-8。无论你使用 还是 ,PHP 在这两种情况下都会获得有效的 UTF-8。utf8utf8mb4utf8utf8mb4

您需要确保的是将PHP和MySQL之间的连接编码设置为。如果设置为 ,MySQL 将不支持所有字符。您可以使用 PDO DSN 连接参数或适用于您选择的数据库 API 的任何其他方法设置此连接编码。utf8mb4utf8mysql_set_charset()charset


mb_internal_encoding只需设置所有函数具有的参数的默认值。它与MySQL无关。$encodingmb_*

UTF-8 和 UTF-32 在编码字符的方式上有所不同。UTF-8 对一个字符使用最少 1 个字节,最多使用 4 个字节。UTF-32 始终为每个字符使用 4 个字节。UTF-16 使用最少 2 个字节,最多使用 4 个字节。
由于其可变长度,UTF-8有一点开销。在 UTF-16 中可以编码为 2 个字节的字符在 UTF-8 中可以采用 3 或 4 个字节;另一方面,UTF-16 从不使用少于 2 个字节。如果您要存储大量亚洲文本,UTF-16 可能会占用较少的存储空间。如果大部分文本是英语/ASCII,则 UTF-8 使用的存储空间会更少。UTF-32 始终使用最多的存储空间。


答案 2

这就是我使用的,并且对我的问题很好,使用欧元符号和转换json_encode失败。

php configurations script( api etc..)

header('Content-Type: text/html; charset=utf-8');
ini_set("default_charset", "UTF-8");
mb_internal_encoding("UTF-8");
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "UTF-8");

mysql 表/或特定列

utf8mb4

mysql PDO connection

$dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';

(...您的连接 ...)

在执行查询之前(可能不是必需的):

$dbh->exec("set names utf8mb4");

推荐