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_ci
和latin1_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是:
latin1
和latin1_swedish_ci
-
8.x doc MySQL Server 8.x(当前版本)默认的Charset和Collation是:
utf8mb4
和utf8mb4_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 set
和 collation
,会自动用MySQL Server的 character set
和collation
。
查看数据的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
- Client在建立连接的时候会指定collation (charset的默认collation);
- MySQL Server根据collation找到对应的charset;
- MySQL Server然后charset设置session变量:
character_set_client
,character_set_results
,character_set_connection
,collation_connection
被设置为指定charset的默认collation。
相关session变量
-
character_set_server
和collation_server
: MySQL Server的Character Set 和 Collation; -
character_set_database
和collation_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_client
和 character_set_results
为指定的charset;
并把 character_set_connection
设置为 character_set_database
的charset。
参考文档
- What is Collation and Character Set in MySQL?
- Character Sets, Collations, Unicode
- What does character set and collation mean exactly?
- MySQL Character Set
- MySQL Collation
- Connection Character Sets and Collations
原文:MySQL基础知识:Character Set和Collation
MySQL基础知识:Character Set和Collation的更多相关文章
-
MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
-
MySQL基础知识:创建MySQL数据库和表
虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...
-
mysql基础知识大全
前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...
-
mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
-
mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
-
MySQL基础知识:启动管理和账号管理
整理.记录常用的MySQL基础知识:时间久了,很多就忘记了. 操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL. ...
-
MySQL基础知识和常用命令总结
说明:以下内容是阅读书籍<<MySQL必知必会>>的摘要和总结 检索数据 排序检索数据 过滤数据 使用通配符过滤 使用正则表达式进行搜索 创建计算字段 使用数据处理函数 汇总数 ...
-
mysql基础知识详解
分享一些mysql数据库的基础知识. 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理.2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程.3 ...
-
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...
随机推荐
-
Magento 新增字段的值读写丢失原因
某实体新增字段handreturn_status,欲操作之: $order_info = Mage::getModel('sales/order')->load($order_id); //se ...
-
springboot与shiro配置
详情参考: http://blog.csdn.net/catoop/article/details/50520958 http://blog.csdn.net/qiuqiupeng/article/ ...
-
Visual Studio 编译项目失败,提示找不到文件
博客地址:http://blog.csdn.net/FoxDave 今天碰到了一个蠢问题,虽然咱们正常情况下是遇不到的,但这确实是个应该注意的地方,所以简单记录一下. Visual Studio ...
-
《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...
-
如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称
如果我们从 title 为 “首页” 的页面 A 点击进入一个子页面 B,那么在页面 B 的左上角将显示一个名为 “<首页” 的按钮.假设这个页面 A 叫 “你是我天边最美的云彩”,那在页面 B ...
-
EasyUi基础学习(一)&mdash;基本组件(上)
一.概述 jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复 ...
-
Lucene的配置及创建索引全文检索
Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene ...
-
VMware下对Ubuntu进行扩充磁盘大小
今天用虚拟机的时候,发现虚拟机快满了,提示磁盘空间小,不得不扩充虚拟机空间.经过百度搜索,终于搞定了,记录如下 平台:VMware(10.0.3)+Ubuntu 14.04(32bit) 1.选择VM ...
-
30天代码day4 Class vs. Instance
Class A blueprint defining the charactaristics and behaviors of an object of that class type. Class ...
-
PHP常用函数归类【持续整理中......】
一.PHP基础语法 变量,常量 严格区分大小写,但内置结构或关键字无所谓(echo) 命名:不能以数字,空格,.来开头,但是可以有汉字,eg:$变量="aa"; ...