25

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

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

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

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

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

知道如何让 php 和 mysql 使用相同的编码(可能是 4 个字节)并且仍然完全支持任何世界语言吗?

还有为什么 utf8mb4 与 utf32 不同?

4

4 回答 4

38

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

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


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

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 总是使用最多的存储空间。

于 2013-06-03T08:54:44.110 回答
10

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

php 配置脚本(api 等)

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 连接

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

(……你的连接……)

在执行查询之前(可能不需要):

$dbh->exec("set names utf8mb4");
于 2015-10-04T20:46:21.810 回答
4
  • utf-32:这是一种字符编码,每个字符使用固定的 4 字节
  • utf-8:这是一种字符编码,每个字符最多使用 4 个字节,但最常见的字符仅编码为 1、2 或 3 个字符。

MySQL 的 utf-8 不支持超过 3 个字符编码的字符,所以他们添加了 utf-8mb4,也就是真正的 utf-8。

于 2013-06-03T08:55:33.490 回答
3

在运行实际查询之前,请执行 mysql_query ('SET NAMES utf8mb4')

还要确保您的 mysql 服务器也配置为使用 utf8mb4。有关如何操作的更多信息,请参阅文章:https ://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

于 2015-02-09T03:43:15.140 回答