我已经读过如果你对某个表/列使用编码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.无论您使用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始终使用最多的存储空间.
这就是我使用的方法,对于使用欧元符号和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)
| 归档时间: |
|
| 查看次数: |
35570 次 |
| 最近记录: |