MySQL基础知识:Character Set和Collation

时间:2023-01-03 14:04:14

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

MySQL基础知识:Character Set和Collation的更多相关文章

  1. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  2. MySQL基础知识:创建MySQL数据库和表

    虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...

  3. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  4. mysql基础知识语法汇总整理&lpar;二&rpar;

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  5. mysql基础知识语法汇总整理&lpar;一&rpar;

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  6. MySQL基础知识:启动管理和账号管理

    整理.记录常用的MySQL基础知识:时间久了,很多就忘记了. 操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL. ...

  7. MySQL基础知识和常用命令总结

    说明:以下内容是阅读书籍<<MySQL必知必会>>的摘要和总结 检索数据 排序检索数据 过滤数据 使用通配符过滤 使用正则表达式进行搜索 创建计算字段 使用数据处理函数 汇总数 ...

  8. mysql基础知识详解

    分享一些mysql数据库的基础知识. 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理.2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程.3 ...

  9. Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型

    1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...

随机推荐

  1. Magento 新增字段的值读写丢失原因

    某实体新增字段handreturn_status,欲操作之: $order_info = Mage::getModel('sales/order')->load($order_id); //se ...

  2. springboot与shiro配置

    详情参考:  http://blog.csdn.net/catoop/article/details/50520958 http://blog.csdn.net/qiuqiupeng/article/ ...

  3. Visual Studio 编译项目失败,提示找不到文件

     博客地址:http://blog.csdn.net/FoxDave 今天碰到了一个蠢问题,虽然咱们正常情况下是遇不到的,但这确实是个应该注意的地方,所以简单记录一下. Visual Studio ...

  4. 《ArcGIS Engine&plus;C&num;实例开发教程》第六讲 右键菜单添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...

  5. 如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 &OpenCurlyDoubleQuote;返回” 按钮的名称

    如果我们从 title 为 “首页” 的页面 A 点击进入一个子页面 B,那么在页面 B 的左上角将显示一个名为 “<首页” 的按钮.假设这个页面 A 叫 “你是我天边最美的云彩”,那在页面 B ...

  6. EasyUi基础学习&lpar;一&rpar;&mdash&semi;基本组件&lpar;上&rpar;

    一.概述      jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复 ...

  7. Lucene的配置及创建索引全文检索

    Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene ...

  8. VMware下对Ubuntu进行扩充磁盘大小

    今天用虚拟机的时候,发现虚拟机快满了,提示磁盘空间小,不得不扩充虚拟机空间.经过百度搜索,终于搞定了,记录如下 平台:VMware(10.0.3)+Ubuntu 14.04(32bit) 1.选择VM ...

  9. 30天代码day4 Class vs&period; Instance

    Class A blueprint defining the charactaristics and behaviors of an object of that class type. Class ...

  10. PHP常用函数归类【持续整理中&period;&period;&period;&period;&period;&period;】

    一.PHP基础语法   变量,常量     严格区分大小写,但内置结构或关键字无所谓(echo)     命名:不能以数字,空格,.来开头,但是可以有汉字,eg:$变量="aa"; ...