我试图将一个php网站的utf8
转换为utf8mb4
,不幸的是,我在localhost上成功了,但在测试服务器上失败了。
localhost:
- php/5.3.29(brew-install php53)或php/5.6.8(examplep)
- Apache/2.4.16
测试服务器:
- PHP/5.6.14
- nginx/1.6.0
它们连接到同一个mysql数据库(编码:utf8mb4,排序规则:utf8mb4_unicode_ci)
数据表:(编码:utf8,排序规则: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';
在本地主机服务器上一切正常,但在测试服务器上则不然。
在测试服务器上,从数据库中获取数据的页面文本显示为???
。我试着从页面插入一个带有表情符号的评论,评论文本是可以的。
我使用mysql客户端Sequel Pro连接数据库,发现刚才插入的注释编码不正确(windows-1252)。PHP将windows-1252文本保存到utf8数据库中。
T_T,请帮我。需要一些php扩展吗?
我已经解决了。
在测试服务器上,php使用没有mysqlnd的mysql扩展,因此字符集取决于/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')
即可。