• MySQL基础知识:Character Set和Collation


    A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.

    • Character Set: 一套字符及其编码,即字符集;(文中很多地方也用 charset 一词)
    • Collation:在字符集内用于比较或排序字符的一套规则,即校验规则。

    操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL

    MySQL Charset和Collation简述

    • MySQL服务器支持多种字符集(Character Set)
    • 每个字符集至少有一个Collation
    • 大部分字符集都有多个Collation
    • 每个字符集都有一个默认的Collation
    • 两个不同的字符集不会有相同的Collation
    • MySQL可以在服务器、数据库、表或字段 级别 指定使用的字符集

    Collation后缀

    Suffix Meaning
    _ai Accent-insensitive
    _as Accent-sensitive
    _ci Case-insensitive
    _cs Case-sensitive
    _ks Kana-sensitive
    _bin Binary
    • 非binary的collation,可以不显示指定 _ai_as_ci会同时隐含_ai_cs会同时隐含_as。如:latin1_general_cilatin1_general_ai_ci是一样的。
    • utf8mb4_0900_ai_ci 中的 0900:Unicode的字符集的Collation需要指定UCA(Unicode Collation Algorithm)版本号, 0900即是这个版本号;如果没有指定,则会使用 version-4.0.0 UCA,如 utf8mb4_unicode_ci

    MySQL Server的Charset和Collation

    查看MySQL Server支持的Charset

    有很多种方法可以查看当前MySQL Server支持的Character Set:

    show character set; -- 方法1
    
    show charset; -- 方法2
    
    show char set; -- 方法3
    
    select * from information_schema.character_sets; -- 方法 4
    

    查看特定字符集信息(主要包含默认的Collation和MAXLEN):

    show character set like 'utf%';; -- 方法1
    
    show charset like 'utf%';; -- 方法2
    
    show char set like 'utf%'; -- 方法3
    
    select * from information_schema.character_sets 
    where CHARACTER_SET_NAME like 'utf%'; -- 方法 4
    

    查看MySQL Server支持的Collation

    SHOW COLLATION WHERE Charset = 'utf8mb4';
    

    或者

    select * from INFORMATION_SCHEMA.COLLATIONS where CHARACTER_SET_NAME='utf8mb4';
    

    查看MySQL Server当前的Charset和Collation

    show variables like 'character_set_server';
    
    show variables like 'collation_server';
    

    或者使用语句:

    select @@character_set_server, @@collation_server;
    

    MySQL Server默认的Charset和Collation

    MySQL官方文档可查看默认的Charset和Collation:

    • <=5.7 doc MySQL Server 5.7或之前版本默认的Charset和Collation是: latin1latin1_swedish_ci
    • 8.x doc MySQL Server 8.x(当前版本)默认的Charset和Collation是: utf8mb4utf8mb4_0900_ai_ci

    修改MySQL Server默认的Charset和Collation

    修改默认值,需要重新编译源码。

    cmake . -DDEFAULT_CHARSET=latin1
    

    或者

    cmake . -DDEFAULT_CHARSET=latin1 
      -DDEFAULT_COLLATION=latin1_german1_ci
    

    指定MySQL Server的Charset和Collation

    可以在启动MySQL Server的时候指定Server的Charset和Collation,下面三种方法是等效的:

    mysqld # 默认的charset是utf8mb4, 而且 utf8mb4 默认的collation是 utf8mb4_0900_ai_ci
    

    mysqld --character-set-server=utf8mb4
    

    mysqld --character-set-server=utf8mb4 
      --collation-server=utf8mb4_0900_ai_ci
    

    数据库(Database)的Charset和Collation

    创建数据库的时候,如果没有指定character setcollation,会自动用MySQL Server的 character setcollation

    查看数据的Character Set和Collation

    USE db_name;
    SELECT @@character_set_database, @@collation_database;
    

    不想改变当前数据库的话,可以使用语句:

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
    FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
    

    指定或修改数据库(Database)的Character Set和Collation

    创建db时指定:

    CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    

    修改:

    ALTER DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    

    表(Table)的Charset和Collation

    如果创建表的时候没有指定表级别Charset和Collation,会默认使用数据库(Database)的Charset和Collation。

    查看表(Table)的Charset和Collation

    SELECT 
    t.TABLE_SCHEMA,
    t.table_name,
    ccsa.* 
    FROM 
    information_schema.`TABLES` t,
    information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` ccsa
    WHERE ccsa.collation_name = t.table_collation
    AND t.table_schema = "db_name"
    AND t.table_name = "table_name";
    

    指定或修改表(Table)的Character Set和Collation

    CREATE TABLE tbl_name (column_list)
        [[DEFAULT] CHARACTER SET charset_name]
        [COLLATE collation_name]]
    
    ALTER TABLE tbl_name
        [[DEFAULT] CHARACTER SET charset_name]
        [COLLATE collation_name]
    

    列(Column)的Charset和Collation

    如果创建表的时候没有指定列的Charset和Collation,会默认使用表(Table)的Charset和Collation。

    查看列(Column)的Charset和Collation

    SELECT 
    *
    FROM information_schema.`COLUMNS`
    WHERE table_schema = "db_name"
    AND table_name = "table_name";
    

    指定或修改列(Column)的Character Set和Collation

    CREATE TABLE t1
    (
        col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
    ) CHARACTER SET latin1 COLLATE latin1_bin;
    
    ALTER TABLE t1 MODIFY
        col1 VARCHAR(5)
          CHARACTER SET latin1
          COLLATE latin1_swedish_ci;
    

    Connection Character Sets and Collations

    Client和MySQL Server交互前,先建立连接(Connection)。

    Client通过建立的connection发送SQL Statements(查询、插入等操作)到MySQL Server;MySQL Server则通过建立的connection返回给Client相应的结果(SQL执行结果,或者错误信息)。

    Client和Server建立连接并设置character set

    1. Client在建立连接的时候会指定collation (charset的默认collation);
    2. MySQL Server根据collation找到对应的charset;
    3. MySQL Server然后charset设置session变量: character_set_client, character_set_results, character_set_connectioncollation_connection被设置为指定charset的默认collation。

    相关session变量

    • character_set_servercollation_server: MySQL Server的Character Set 和 Collation;
    • character_set_databasecollation_database:数据库的Character Set 和 Collation;
    • character_set_client :MySQL Server使用此session变量的charset作为client 发送来的SQL Statements的charset;
    • character_set_connection: Server会把client发送的statements字符集从character_set_client转为character_set_connection
    • collation_connection:这个对字符串常量的比较很重要;
    • character_set_results:Server返回给client的结果(column values, result metadata such as column names, and error messages)对应的字符集;

    查看connection相关的session变量:

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    

    设置character set和collation

    SET NAMES {'charset_name'
        [COLLATE 'collation_name'] | DEFAULT}
    

    SET NAME 会设置三个session变量(session system variables)为指定的charset和collation:

    • character_set_client
    • character_set_connection
    • character_set_results
    SET {CHARACTER SET | CHARSET}
        {'charset_name' | DEFAULT}
    

    SET CHARACTER SET会设置 character_set_clientcharacter_set_results为指定的charset;

    并把 character_set_connection 设置为 character_set_database 的charset。

    参考文档

    1. What is Collation and Character Set in MySQL?
    2. Character Sets, Collations, Unicode
    3. What does character set and collation mean exactly?
    4. MySQL Character Set
    5. MySQL Collation
    6. Connection Character Sets and Collations

    原文:MySQL基础知识:Character Set和Collation

    微信公众号:编码者频道

    扫描二维码(或者长按识别二维码)关注公众号获取最新信息。

    本文版权归作者和博客园共有,欢迎转载,

    转载请保留原文链接,谢谢!

  • 相关阅读:
    2.1 ArrayList 线程不安全,LinkedList 线程不安全,Vector 线程安全
    Mybatis详解(二)--动态代理(未集成Spring)
    3.2经典垃圾收集器
    3.垃圾收集器与内存分配
    6.类文件结构(Class结构)
    7.类加载机制
    spark实现从hbase中批量查询多个rowKey
    spark实现分页查询hbase
    查询mysql数据库的表名,主键
    redis退出异常:ERR Errors trying to SHUTDOWN. Check logs.
  • 原文地址:https://www.cnblogs.com/codesee/p/14519975.html
Copyright © 2020-2023  润新知