MySql 支持 Emoji 表情

问题

当我们数据库中存储 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',
],

发表评论