Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

    • MySQL8一键安装配置优化
    • MySQL导出CSV格式解决乱码
    • MySQL 角色管理
    • MySQL网络抓包审计
    • MySQL性能压测
    • MySQL配合Consul读写分离
    • Gh-ost重建表,清除表碎片率
    • MySQL MGR配合MySQL-router实现innodb-cluster
    • MySQL 快速分析binlog定位问题
    • MySQL执行计划分析
    • DBA常用SQL和命令整理备查
    • mysqldump实时同步数据
    • MySQL的事务隔离级别
    • MySQL存储过程批量生成数据
    • MySQL insert on duplicate key update,replace into , insert ignore的理解
    • MySQL不同字符集之间的区别和选择
      • 常见字符集
        • 1. UTF-8
        • 2. UTF-16
        • 3. GBK(GB2312的扩展)
        • 4. Latin1
      • 选择字符集的考虑因素
      • 排序规则(Collation)
        • 什么是排序规则
        • 常见排序规则
      • 示例
      • 检查和修改字符集与排序规则
        • 查看当前MySQL实例中不符合字符集和排序规则规范的库名
        • 查看当前MySQL实例中不符合排序规范的表
        • 修改数据库的字符集和排序规则
        • 修改表及表字段的字符集和排序规则
    • MySQL为什么有时候会选错索引
    • MySQL死锁问题
    • MySQL使用SQL语句查重去重
    • MySQLdump逻辑备份
    • MySQL主从跳过异常GITD
    • MySQL8设置slowlog记录所有语句
    • MySQL8快速克隆插件使用指南
    • MySQL8双1设置保障安全
    • MySQL锁
    • innodb cluster安装
    • MySQL里的left join 和right join以及inner join
    • optimize table和 analyze table的区别
    • MySQL 字段的区分度计算公式
    • MySQLReplicaSet 安装
    • 脚本实现MySQL ReplicaSet 高可用
    • MySQL 的Left join,Right join和Inner join 的区别
    • MySQL45讲学习笔记
  • Redis

  • Keydb

  • TiDB

  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • MySQL
Carry の Blog
2022-03-12
目录

MySQL不同字符集之间的区别和选择原创

# MySQL不同字符集之间的区别和选择

MySQL支持多种字符集,每种字符集有其特定的用途和适应场景。主要的字符集包括:

# 常见字符集

# 1. UTF-8

  • 用途: 支持全球大多数语言的字符,是最通用的字符集之一。
  • 特点: 每个字符占用1到4个字节,可存储各种语言的文本。

# 2. UTF-16

  • 用途: 用于存储Unicode字符,每个字符占用2或4个字节。
  • 特点: 在存储大量亚洲语言字符时比UTF-8更有效率。

# 3. GBK(GB2312的扩展)

  • 用途: 主要用于简体中文,每个字符占用2个字节。
  • 特点: 不支持其他语言,不适合多语言应用。

# 4. Latin1

  • 用途: 适用于西欧语言,每个字符占用1个字节。
  • 特点: 不支持亚洲语言。

# 选择字符集的考虑因素

在选择字符集时,应考虑以下因素:

  • 语言支持: 选择支持你应用中所用语言的字符集。
  • 存储空间: 不同字符集的存储空间占用不同,UTF-8相对较节省空间。
  • 性能: 一些字符集在特定应用场景下可能更高效。
  • 排序和比较: 不同字符集可能导致不同的排序和比较结果。

# 排序规则(Collation)

# 什么是排序规则

排序规则定义了字符集中的字符如何进行比较和排序。不同的排序规则会影响数据的排序和查询结果。选择合适的排序规则非常重要,因为它直接影响数据库的性能和用户体验。

# 常见排序规则

  • utf8_general_ci:

    • 特点: 大小写不敏感的通用排序规则,适用于大多数场景。
    • 优点: 性能较好,适合不需要严格区分大小写的应用。
    • 缺点: 在某些语言中,排序结果可能不符合预期。
  • utf8mb4_unicode_ci:

    • 特点: 基于Unicode标准的排序规则,支持更多特殊字符。
    • 优点: 提供更准确的排序和比较结果,适用于多语言应用。
    • 缺点: 性能略低于utf8_general_ci。
  • utf8mb4_bin:

    • 特点: 二进制排序规则,严格区分大小写和重音符号。
    • 优点: 提供最精确的比较结果。
    • 缺点: 性能较低,适用于对大小写和特殊字符敏感的应用。

# 示例

在创建数据库或表时,你可以指定字符集和排序规则。例如:

查看SQL示例
CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
1

这会创建一个使用UTF-8字符集和utf8mb4_unicode_ci排序规则的数据库。确保选择适合你应用需求的字符集和排序规则。

# 检查和修改字符集与排序规则

# 查看当前MySQL实例中不符合字符集和排序规则规范的库名

查看SQL示例
SELECT
SCHEMA_NAME '数据库',
DEFAULT_CHARACTER_SET_NAME '库字符集',
DEFAULT_COLLATION_NAME '库排序规则'
FROM
information_schema.SCHEMATA
WHERE
(DEFAULT_CHARACTER_SET_NAME != 'utf8mb4' OR DEFAULT_COLLATION_NAME != 'utf8mb4_unicode_ci')
AND SCHEMA_NAME NOT IN ( 'sys', 'mysql', 'performance_schema', 'information_schema' );
1
2
3
4
5
6
7
8
9

# 查看当前MySQL实例中不符合排序规范的表

查看SQL示例
SELECT TABLE_SCHEMA '数据库',TABLE_NAME '表',TABLE_COLLATION '表排序规则',TABLE_ROWS '表行数' 
FROM information_schema.TABLES 
WHERE TABLE_COLLATION != 'utf8mb4_unicode_ci' 
AND TABLE_SCHEMA NOT IN ('sys','mysql','performance_schema','information_schema');
1
2
3
4

# 修改数据库的字符集和排序规则

在修改表及表字段的字符集和排序规则之前,需要先修改库的字符集和排序规则:

查看SQL示例
SELECT
SCHEMA_NAME '数据库',
DEFAULT_CHARACTER_SET_NAME '库字符集',
DEFAULT_COLLATION_NAME '库排序规则',
CONCAT( 'ALTER DATABASE ', SCHEMA_NAME, ' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) '修正库规则SQL'
FROM
information_schema.SCHEMATA
WHERE
(DEFAULT_CHARACTER_SET_NAME != 'utf8mb4' OR DEFAULT_COLLATION_NAME != 'utf8mb4_unicode_ci')
AND SCHEMA_NAME NOT IN ( 'sys', 'mysql', 'performance_schema', 'information_schema' );
1
2
3
4
5
6
7
8
9
10

# 修改表及表字段的字符集和排序规则

查看SQL示例
SELECT TABLE_SCHEMA '数据库',TABLE_NAME '表',TABLE_COLLATION '排序规则',
CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') '修正表规则SQL' 
FROM information_schema.TABLES 
WHERE TABLE_COLLATION != 'utf8mb4_unicode_ci' 
AND TABLE_SCHEMA NOT IN ('sys','mysql','performance_schema','information_schema');
1
2
3
4
5

通过使用上述SQL语句,可以有效地检查并修正数据库和表的字符集和排序规则,确保数据的一致性和正确性。


#字符集#编码#数据库优化
上次更新: 4/24/2025

← MySQL insert on duplicate key update,replace into , insert ignore的理解 MySQL为什么有时候会选错索引→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
如何移除TiDB中的表分区 原创
04-03
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式