一、什么是字符集与校对

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

MySQL字符集与校对的更多相关文章

  1. MySQL字符集及校对规则的理解

      阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对 ...

  2. Mysql字符集与校对规则

    字符集是一套字符和编码的集合,校对规则是用于比较字符集的一套规则. 所以字符集有两部分组成字符集合和对应的编码集合.比如说,现在有这几个字符:A B a b, 假设它们对应的编码分别是00, 01, ...

  3. mysql之字符集与校对集

    一.字符集 1.mysql的字符集设置非常灵活 可以设置服务器默认字符集: 数据库默认字符集: 表默认字符集: 列字符集: 如果某一级别没有指定字符集,则继承上一级. 查看所有字符集语句:show c ...

  4. mysql之全球化和本地化:字符集、校对集、中文编码问题

    本文内容: 什么是字符集?什么是校对集? 查看字符集和校对集 设置字符集和校对集 mysql中的中文数据问题 首发日期:2018-04-19 什么是字符集?什么是校对集? 字符集是字母和符号的集合,每 ...

  5. MySQL开发——【字符集、校对集】

    字符集 查看MySQL中的字符集 基本语法: show character set; 查看MySQL中的默认字符集 基本语法: show variables like ‘character_set%’ ...

  6. MySQL字符集

    字符集的选择 1.如果数据库只需要支持中文,数据量很大,性能要求也很高,应该选择双字节定长编码的中文字符集(如GBK).因为相对于UTF-8而言,GBK"较小",每个汉字只占2个字 ...

  7. [MySQL] 字符集的选择

    1. Mysql支持的字符集 MySQL服务器可以支持多种字符集,不同的字段都可以使用不同的字符集. 查看所有可用字符集: show character set; select * from info ...

  8. MySQL字符集编码

    MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...

  9. MySQL字符集设置—MySQL数据库乱码问题

    MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...

随机推荐

  1. 修改Anaconda中的Jupyter Notebook默认工作路径

    这二天,安装了anaconda想更改jupyter的工作路径,在网上找了一下 方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如 ...

  2. cocos2dx AudioEngine在Android7上播放音效卡顿问题处理

    1.此问题在cocos2dx 3.13/3.14版本(其它版本没有测试过)在Android7中使用AudioEngine的play2d函数播放音效时出现. 调试时出现如下提示: 2.论坛中相关讨论帖地 ...

  3. ajax和iframe区别

    ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...

  4. Asp.net core 学习笔记 (操作 url and query params)

    更新 :2018-7-25 直接添加 query string. var resetPasswordLink = QueryHelpers.AddQueryString($"{Request ...

  5. Redis消息之发布与订阅

    "发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...

  6. Go语言学习之7 接口实例、终端文件读写、异常处理

    本节主要内容: 1. 终端读写2. 文件读写3. 命令行参数4. Json5. 自定义错误 1. 终端读写 操作终端相关文件句柄常量    os.Stdin:标准输入    os.Stdout:标准输 ...

  7. java,sort函数的深刻理解

    先来看看题目吧: 链接:https://www.nowcoder.com/questionTerminal/97b6a49a85944650b2e3d0660b91c324来源:牛客网 [编程题]德才 ...

  8. 树上第k大联通块

    题意:求树上第k大联通块 n,k<=1e5 考虑转化为k短路的形式. 也就是要建出一张图是的这条图上每一条S到T的路径都能代表一个联通块. 点分治建图 递归下去,假定每个子树的所有联通块中都可以 ...

  9. js中const、let、var的区别

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...

  10. 6月13 ThinkPHP框架基础

    ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...