为什么PHP将windows-1252文本保存到utf8mb4数据库?

时间:2015-12-22 08:48:59

标签: php mysql utf-8

我试图将utf8转换为utf8mb4以获取php网站,不幸的是,我在localhost上取得了成功但在测试服务器上失败了。

本地主机:

  • php / 5.3.29(brew install php53)或PHP / 5.6.8(xampp)
  • Apache / 2.4.16

测试服务器:

  • PHP / 5.6.14
  • nginx / 1.6.0

它们连接到同一个mysql数据库(编码:utf8mb4,collat​​ion:utf8mb4_unicode_ci)。
数据表:(编码:utf8,collat​​ion:utf8_unicode_ci)
一些数据表:(编码:utf8mb4,整理:utf8mb4_unicode_ci)

带有CodeIgniter框架当前配置的php网站:

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

使用此配置,一切正常。当我将配置更改为:

$db['default']['char_set'] = 'utf8mb4';
$db['default']['dbcollat'] = 'utf8mb4_general_ci';

我的localhost服务器上的一切正常,但测试服务器没有。

在测试服务器上,从DB获取数据的页面文本显示???。我尝试从页面插入带表情符号的评论,评论文本没问题。

我使用mysql客户端Sequel Pro连接数据库,我发现刚刚插入的注释是不正确的编码(windows-1252)。 PHP将windows-1252文本保存到utf8数据库。

T_T,请帮帮我。是否需要一些PHP扩展?

1 个答案:

答案 0 :(得分:0)

我已经解决了。

在测试服务器上,php使用mysql扩展而没有mysqlnd,因此charset依赖于/usr/share/mysql/charsets/设置。如果错过utf8mb4定义,则mysql_set_charset功能将失败:2019: Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)

只需使用mysql_query('SET NAMES utf8mb4')