记一次存储emoji表情问题

记一次存储emoji表情

问题原因

  1. mysql常用的字符集如下

    字符集: utf8mb3
    排序规则: utf8mb3 general_ci
    # 上面的字符集就是我们所说的普通的utf-8
    
    字符集:utf8mb4
    排序规则:utf8mb4 0900 ai ci
    
  2. 上述两种字符集想要存储emoji需要使用utf8mb4这种字符集

  3. 查询数据库的字符集

    SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = 'your_database_name';
    
  4. 查询表的字符集

    SELECT CCSA.character_set_name FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = 'your_database_name' AND T.table_name = 'your_table_name';
    
  5. 查询字段的字符集

    SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = 'your_database_name' AND table_name = 'your_table_name' AND column_name = 'your_column_name';
    

如果上述查询结果又任何一项不是utf8mb4都无法写入emoji

问题解决方法

使用命令行修改字符集

  1. 更改数据库字符集

    ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    
  2. 更改表字符集

    ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  3. 更改字段字符集

    ALTER TABLE your_table_name MODIFY your_column_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

使用dbeaver修改字符集

  1. 双击数据库名称,会出现如下内容,将图中标红的修改utf8mb4字符集,排序规则会随之改变

  2. 双击数据表名称,会出现如下内容,将图中标红的修改utf8mb4字符集,排序规则会随之改变

  3. 双击表字段名称,会出现如下内容,将图中标红的修改utf8mb4字符集,排序规则会随之改变

修改数据库连接方式

项目框架是django,这里以django配置为例

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': env("DB_NAME"),
        'USER': env("DB_USER"),
        'PASSWORD': env("DB_PASSWORD"),
        'HOST': env("DB_HOST"),
        'PORT': env("DB_PORT"),
        # 需要在此处增加以下配置,修改数据库的连接方式为utf8mb4
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; SET character_set_connection=utf8mb4;",
        },
    }
}
posted @ 2023-05-18 11:06  Lowell  阅读(50)  评论(0编辑  收藏  举报