问题
当我们数据库中存储 emoji 表情时,在数据库中查看时,呈现的是乱码,查出显示在页面也是乱码。
原因
当前,我们创建表时,会设置 default charset=utf8
,即为 utf8 编码; 但是,UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。所以出现乱码情况
解决
将Mysql的编码从utf8转换成utf8mb4:
# 修改数据库字符集:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# 修改表的字符集:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 修改某个表的字段字符集:
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
在建表时,如果表中字段可能会存储 emoji 等字符时,设置默认的字符集
create table `tablename`
(
....
) engine = innodb default charset = utf8mb4;
在连接数据库时,设置编码(php为例):
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=sales_help',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
],