• MySQL字符集与校对


    一、什么是字符集与校对

    1.字符集与校对

    字符集是指一种从二进制编码到某种字符符号的映射。

    校队是指一组用于某个字符集的配许规则。

    2.utf8与utf8mb4

    标准的UTF-8字符集编码是可以使用1-4个字节去编码21位字符,这几乎包含了世界上所有能看见的语言。
    MySQL里面实现的utf8最长使用3个字符,包含了大多数字符但并不是所有。例如emoji和一些不常用的汉字,如“墅”,这些需要四个字节才能编码的就不支持。

    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。建议选用utf8mb4的编码。

    二、如何设置字符集与校队

    数据库默认字符集设置:character_set_server

    表的字符集设置:将根据数据库的字符集设置来指定这个表的字符集

    列的字符集设置:将根据表的设置来指定列的字符集设置

    注意:真正存放数据的是列,所以更高“阶梯”的设置只是制定默认值。一个表的默认字符集设置,无法影响存储在这个表中某个列的值。只有当创建列,而没为列有指定字符集的时候,表的默认字符集才会在列上生效。

    1.查看、修改数据库字符集与校对

    1)查看

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

    2)修改

    在配置文件中修改

    character_set_server = utf8mb4

    collation_server         = utf8mb4_unicode_ci

    2.查看、修改指定数据库的字符集与校对

    1)查看

    SHOW CREATE DATABASE dbname;

    2)修改

    ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];  

    3.查看、修改表的字符集与校对

    1)查看

    select * from information_schema.TABLES where TABLE_SCHEMA='ifpay_account';

    select TABLE_SCHEMA,TABLE_NAME,TABLE_COMMENT,TABLE_COLLATION from information_schema.TABLES where TABLE_SCHEMA='ifpay_account';

    SHOW CREATE TABLE tbl_name;

    2)修改

    修改表的字符集与校队

    ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];

    修改表与列的字符集与校对

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...] ;

    4.查看、修改列的字符集与校对

    1)查看

    SHOW FULL COLUMNS FROM tbl_name;

    2)修改

    ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...]; 

    最后根据数据字典,查询相关信息

    列:

    查看列的详细信息

    select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME,COLUMN_TYPE,IS_NULLABLE from information_schema.columns
    where TABLE_SCHEMA in ('ifpay_ccpay','ifpay_schedule') and COLLATION_NAME is not null;

    查看列的COLLATION类型统计

    select TABLE_SCHEMA,COLLATION_NAME,count(*) from information_schema.columns where TABLE_SCHEMA
     in('ifpay_ccpay','ifpay_schedule') and COLLATION_NAME is not null
    group by TABLE_SCHEMA,COLLATION_NAME;

    表:

    select table_schema,table_name,engine,table_collation from information_schema.TABLES where TABLE_SCHEMA
     in ('ifpay_ccpay','ifpay_schedule') ;

    数据库:

    select * from mysql.db

    三、关于MySQL中的7个 character_set 变量说明

    1.character_set变量

    1)character_set_client

           主要用来设置客户端使用的字符集。

    2)character_set_connection
      主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。

    3)character_set_database
      主要用来设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。

    4)character_set_filesystem
      文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。

    5)character_set_results
      数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。

    6)character_set_server
      服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。

    7)character_set_system
      数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。

    2.MySQL各个字符集使用出处

    在启动mysql后,我们只关注下列变量是否符合我们的要求
    character_set_client
    character_set_connection
    character_set_database
    character_set_results
    character_set_server
    下列两个系统变量我们不需要关心,不会影响乱码等问题
    character_set_filesystem
    character_set_system

    mysql Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection
    进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,步骤如下
      A. 使用每个数据字段的 CHARACTER SET 设定值;
      B. 若上述值不存在,则使用对应数据表的字符集设定值
      C. 若上述值不存在,则使用对应数据库的字符集设定值;
      D. 若上述值不存在,则使用 character_set_server 设定值。
    最后将操作结果从内部操作字符集转换为 character_set_results

    参考:

    https://blog.csdn.net/sun8112133/article/details/79921734

  • 相关阅读:
    php 字符串查找
    php缓存与加速分析与汇总
    oracle 时间问题
    mysql数据迁移
    浅谈千万级PV/IP规模高性能高并发网站架构
    对memcache分布式的一点理解
    美国程序员将工作廉价外包给中国公司遭解雇
    16个Linux服务器监控命令
    在yii中使用memcache
    Windows电脑快捷健大全
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/9927992.html
Copyright © 2020-2023  润新知