使用utf8mb4与PHP和MySQL

nou*_*ine 19 php mysql

我已经读过如果你对某个表/列使用编码utf8mb4,mysql> = 5.5.3完全支持每个可能的字符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不同?

dec*_*eze 30

MySQL的utf8编码不是真正的UTF-8.它的编码有点像UTF-8,但只支持UTF-8支持的子集.utf8mb4实际的 UTF-8.这种差异是MySQL 的内部实现细节.两者在PHP方面看起来都像UTF-8.无论您使用utf8utf8mb4,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始终使用最多的存储空间.


Mig*_*uel 5

这就是我使用的方法,对于使用欧元符号和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");
Run Code Online (Sandbox Code Playgroud)

mysql表/或特定列

utf8mb4
Run Code Online (Sandbox Code Playgroud)

mysql PDO连接

$dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';
Run Code Online (Sandbox Code Playgroud)

(...您的联系方式...)

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

$dbh->exec("set names utf8mb4");
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是不准确的。如果您使用的是“设置名称utf8”,则您的连接仅在* real * utf8的子集中与mysql通讯。您需要“设置名称utf8mb4”以完整的utf8字符集(包括传递的表情符号)说话。否则,mysql经常会在遇到大于3个字节的utf字符时截断字符串 (2认同)