zoukankan      html  css  js  c++  java
  • MySQL 字符集与比较规则

    MySQL 字符集与比较规则

    由于 MySQL 客户端与服务端之间通信时需要将字符串编码传输,所以不可避免会产生编码转换

    字符集

    MySQL 中 utf8 就是 utf8mb3,只使用 1~3 个字节表示字符
    utf-8md4 使用 1~4 个字节表示字符

    相关参数

    MySQL 服务器有以下几个参数与编码有关
    字符集相关参数:
    character_set_server 服务器级别的字符集
    character_set_database 当前数据库的字符集 (如果没有使用 USE 选择数据库,则查看服务器级别的字符集) 只读,无法通过修改改变当前数据库参数
    字符集转换相关参数:
    character_set_client 服务器会认为客户端发送的请求为这个字符集,会将请求以这个字符集的形式进行解码,获取请求内容
    character_set_connection 服务器内部处理请求时使用的字符集,服务器会将客户端的请求以这个字符集的形式进行编码 (如果与处理的数据字符集不同就会再进行一次转换)
    character_set_results 服务器会将返回的结果以这个字符集的形式进行编码后返回给客户端

    查看命令

    MySQL 支持许多字符集,通过以下命令可以查看所有支持的字符集

    SHOW CHARACTER SET;
    SHOW CHARSET;
    

    其中 Default collation 就是这种字符集的默认比较规则,Maxlen 就是这种字符集表示一个字符最多需要的字节数

    查看其他参数

    SHOW VARIABLES LIKE 'character_set_server';
    SHOW VARIABLES LIKE 'character_set_database';
    SHOW VARIABLES LIKE 'character_set_client';
    SHOW VARIABLES LIKE 'character_set_connection';
    SHOW VARIABLES LIKE 'character_set_results';
    

    设置命令

    设置字符集参数

    服务器级别:

    SET character_set_server 字符集名;
    

    数据库级别:

    CREATE DATABASE 数据库名
    CHARACTER SET 字符集名称;
    
    ALTER DATABASE 数据库名
    CHARACTER SET 字符集名称;
    

    表级别

    CREATE TABLE 表名 (列的信息)
    CHARACTER SET 字符集名称;
    
    ALTER TABLE 表名
    CHARACTER SET 字符集名称;
    

    列级别

    CREATE TABLE 表名(列名 字符串类型 CHARACTER SET 字符集名称);
    
    ALTER TABLE 表名 MODIFY 列名 字符串类型 CHARACTER SET 字符集名称 ;
    

    设置字符集转换参数

    一般为了方便会将三个参数设置为同一字符集
    使用以下命令就可以同时设置三个参数

    SET NAMES 字符集名;
    

    当然也可以分开设置

    SET character_set_client = 字符集名;
    SET character_set_connection = 字符集名;
    SET character_set_results = 字符集名;
    

    比较规则

    比较规则有时也称为排序规则,用于在字符串比较大小时规定其顺序的
    同一种字符集可以有多种比较规则

    命名规则

    每一种字符集都可能对应多种比较规则,这些比较规则命名规律为

    • 比较规则名称以对应的字符集名称开头
    • 中间部分表示主要用于哪种语言
    • 后缀有以下几种:
    后缀 全称 含义
    `_ai` accent insensitive 不区分重音
    `_as` accent sensitive 区分重音
    `_ci` case insensitive 不区分大小写
    `_cs` case sensitive 区分大小写
    `_bin` binary 以二进制方式比较
    示例: `utf8_spanish_ci` 表示以西班牙语比较,且不区分大小写

    相关参数

    collation_server 服务器级别的比较规则
    collation_database 当前数据库的比较规则 (如果没有使用 USE 选择数据库,则查看服务器级别的比较规则) 只读,无法通过修改改变当前数据库参数

    查看命令

    将比较规则全部列出来比较多,可以根据对应的字符集进行筛选

    SHOW COLLATION;
    SHOW COLLATION LIKE 'utf8\_%';
    

    其中 Charset 表示对应的字符集,Default 表示是否为默认比较规则

    设置命令

    设置比较规则参数

    服务器级别:

    SET collation_server 比较规则名;
    

    数据库级别:

    CREATE DATABASE 数据库名
    COLLATE 比较规则名称;
    
    ALTER DATABASE 数据库名
    COLLATE 比较规则名称;
    

    表级别

    CREATE TABLE 表名 (列的信息)
    COLLATE 比较规则名称;
    
    ALTER TABLE 表名
    COLLATE 比较规则名称;
    

    列级别

    CREATE TABLE 表名(列名 字符串类型 COLLATE 比较规则名称);
    
    ALTER TABLE 表名 MODIFY 列名 字符串类型 COLLATE 比较规则名称 ;
    

    总结

    当只修改某个级别的字符集或比较规则时,相同级别对应的比较规则或字符集也会跟着改变为对应的 (默认的)
    当创建数据库时如果没有指定字符集和比较规则,则默认使用服务器级别的参数
    创建表时没有指定字符集和比较规则,则默认使用表所在数据库的参数
    创建列时没有指定字符集和比较规则,则默认使用列所在表的参数

  • 相关阅读:
    如何在域和域之间建立信任域?关键是配置域和域之间的DNS服务器
    Client Recevier 命令安装 AllUsers=1
    在XD 4.0 设置Policy
    更改linux系统中键盘设置
    如何在DNS中添加另一DNS
    CMD命令
    KMS激活OS(系统)
    谁抢了我的IP!!!~
    关于域证书的发布CA和CRL的内容 (Windows 2008 Server R2 SP1)
    XenServer假死状态
  • 原文地址:https://www.cnblogs.com/dbf-/p/11607609.html
Copyright © 2011-2022 走看看