写在前面: 本文——mysql字符集(character set)和排序规则(collation)的初步总结,源于学习过程当中对select length('汉字');
的好奇,因为学习阶段及时间问题,部分疑问最终没有很好的解决.暂时再也不探究。总结粗糙,理解不精,主要为我的学习过程记录,方便后期复习,仅供网友参考,欢迎提出看法。html
MySQL 8.0 默认的 character set(字符集) and collation(排序规则) 是 utf8mb4 和 utf8mb4_0900_ai_ci, 具体来说能够分别指定 :服务器(server),数据库(database),表(table),列(column)以及原义字符串(character string literal )的character set 和对应的 collationmysql
show character set ; show collation ;
二者均可添加限定条件语句:like或where clause#character set 能够简写为charset;
手册10.3.1 节详细介绍了character set 和 collation 的命名规则
use information_schema;
select * from character_sets,collations [where clause];
show [session ]variables like 'char%'/'collation%';
select * from performance_schema.session_variables where variable_name like 'character_set_%';
1.5可解以下困惑:sql
select length('张'); mysql > 2
use pra ;select legnth(stu_name) from stuinfo where stuid = 1; mysql> 6
Character string literal 译为原义字符串,指的是在Query clause 中的字符串,脱离于表,与表无关。手册10.3.6节。数据库
2.1 形式为 [_charset_name]'string' [COLLATE collation_name];
express
2.2 解释:The _charset_name expression is formally called an introducer. It tells the parser, “the string that follows uses character set charset_name.”
。服务器
2.3
session
2.4 困惑 在系统CMD窗口
① select length('你') ;
mysql>2
②select length(_utf8mb4 '你') ;
mysql>2
运行结果不变,经过命令1.3(表1)可看到character_set_connection = gbk ,①可理解,那么②呢?
字符串'你'以前的 introducer 无效吗?2.2解释It tells the parser, “the string that follows uses character set charset_name.
到底什么意思,中间还涉及什么过程。app
2.4.1 换用了MySQL Client CMD 运行,链接字符集一样为gbk,运行结果也都为 2 。换用navicat命令行执行,链接字符集变为utf8mb4 (client ,results字符集也都变为utf8mb4),两条select语句执行结果都变为 3 (第二条的introducer 修改成 _gbk)。
结论:introducer 对于字符串自己没有影响,仍是受character_set_connection或其余变量 影响 (说法不许确)函数
2.4.2 查阅手册10.3.8 introducer相关知识:学习
An introducer does not change the string to the introducer character set like CONVERT() would do. It does not change the string value, although padding may occur. The introducer is just a signal. (不太理解)
① 查阅12.11节 Cast Functions and operators 的 convert(expr using transcoding_name)函数 :converts data between different character sets.
,貌似是真正的转换。
② 这不一样于introducer中的表述:It does not change the string value, although padding may occur. The introducer is just a signal
(它究竟是干吗的)
③ 运行 select length(convert('你' using utf8mb4)); mysql> 3
,而此时character_set_connection 仍然为gbk
那么结合①,到底introducer 到底发挥什么样的做用,character_set_connection 发挥什么样的做用, ?
2.4.3 查看手册10.4节 Connection character set and collation ,该部分涉及到了客户端与服务器的交互过程当中的编码转换过程。
① 服务器从客户端接收以character_set_client 编码的语句(statements);
② 服务器将接收到的statements 从character_set_client 转译(translate/convert)为character_set _connection.
此处提到:For string literals that have an introducer such as _utf8mb4 or _latin2, the introducer determines the character set. (怎么determine呢,上面没感受determine呀)
又说起:collation_connection 对于literal strings 的比较是重要的,对于表列中的字符串的比 较可有可无 。
③ server 将执行结果以character_set_results 的编码形式传回client
④:在七把刀简书博文中的介绍部分不能理解:指定introducer 后的解释。
2.4.4 总: 与当下学习任务关联度不大,在该问题上耗时过长,再也不花费时间纠结。粗略结论:①introducer 在整个过程当中没有起到多大做用 ;
② convert函数能够实实在在的看到效果;
③单独或一同修改(client,connection,results)并结合三者(无introducer ,有introducer, convert转换)试验后,效果迷离,心累,再也不探究;
④问题关键仍是没有理解introducer, 各字符集,以及客户端与服务器交互时的编码转换过程。往后涉及,在经验积累的基础上再行探究。
分类
3.1 字段级别
show full columns from table_name;
show table status [ from databse_name / where name like '%name%'];
alter table table_name modify filed_name field_type field_charset_name;
3.2 表级别
查看建表语句(最新的,含修改过的 )( 其中包含当前表设置的默认的character set ,collation信息)
show create table table_name;
修改表的charset和collation
alter table table_name charset charset_name;
3.3 数据库级别
查看当前数据库默认的字符集,以及排序规则
show variables where variable_name = 'character_set_database'
use database_name;
select @@character_set_database,@@collation_database;
select default_character_set_name,default_collation_name
from information_shema.schemata
where shcema_name = 'db_name';
查看建数据库语句,从而了解当前数据库默认的字符集,以及排序规则。
show create database database_name
修改数据库的character set 和collation
alter database database_name charset utf8mb4
3.4 服务器级别
show variables where variable_name = 'character_set_server ;'
show variables like 'char%';
set character_set_server= utf8mb4;
3.5 查看**connection , client , results ** 字符集,排序规则
例如 : select @@character_set_connection,@@collation_connetcion;
或者: show variables like 'char%' ;
4.其余
函数 length(),char_length(),character_length() 区别参见手册12 章 Functions and operators 。
手册13.7节Database Adminstration Statement 的13.7.6.3 介绍了Set Names Statements.
set names('charset_name' [collate 'collation_name'] | default);
The default mapping can be restored by using a value of DEFAULT. The default depends on the server configuration
细节及注意点,查看手册。博客set name statements总结详细,可参考。
总结粗糙,理解不精,往后更新完善。欢迎提出看法。