mysql字符集和校对规则(charactersetsandcollations)详解mysql字符集(character sets)是指⼀系列符号以及符号对应的编码的集合,⽐如英⽂字母可以⽤ASCII编码,中⽂可以⽤GBK或者UTF8编码。校对规则(collations)则是指⼀种⽐较字符的规则,这种⽐较规则决定了mysql如何进⾏排序以及如何对字符⽐较⼤⼩。
mysql的character sets和collations有很多种,⽽且可以在多个维度去配置,包含服务器的配置和客户端的配置,对于初学者往往容易搞混,有时候出了乱码等问题也不知道怎么排查。今天笔者就详细梳理⼀下mysql中的character sets和collations。
我们先来看看mysql都可以配置哪些字符集,输⼊如下命令查看。
show variables like '%character%';
可以看到,有多达7个的character_set相关的参数,接下来我们就详细说说这些参数。
查看mysql中⽀持的字符集和校对规则
mysql中每个字符集都会对应多个校对规则,是⼀对多的关系。⽐如utf8对应的collation有
utf8_general_ci,utf8_bin,utf8_unicode_ci等。⽽且每个character set会有个默认的collation与之对应,当我们在创建数据库或者创建表时如果只指定character set,不指定collation,就会使⽤character set默认的collation。collation的命名是以对应的character set 为开头,⽐如collation为utf8_general_ci,我们就知道这个collation对应的字符集是utf8。
查看字符集
2种⽅式可以查看mysql中⽀持哪些字符集
1. 通过INFORMATION_SCHEMA.CHARACTER_SETS表来查看
2. 通过SHOW CHARACTER SET来查看,和上⾯表的结果是⼀样的。
查看collations
通过 show collation 查看校对规则有哪些,还可在语句后⾯加where条件筛选。
配置与查看字符集与校对规则
服务器端相关character set和collation
mysql服务器端相关字符集是服务器对数据的存储等相关的字符集,不涉及客户端的问题。
mysql服务器端的字符集和校对规则可以在四个级别指定:server, database, table, column
server级别
在mysql5.7中,server character set 和 server collation 默认为 latin1 和 latin1_swedish_ci,在mysql8中,默认为utf8mb4 和utf8mb4_0900_ai_ci
如果想要修改server级别的character set和collation,可以在启动时指定参数
mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci
或者将上⾯的参数写⼊到my.ini中[mysqld]下⾯,如下图。
server级别的character set和collation的作⽤是为创建数据库(CREAT DATABASE)时指定默认字符集和校对规则。也就是说创建数据库时如果没有指定character set和collation,就默认使⽤server级别的。
server级别的character set 和 collation可通过如下命令查看
show variables like 'character_set_server'
show variables like 'collation_server'
database级别
数据库级别的character set和collation可以在创建和修改数据库时指定,如果不指定,则使⽤server级别的。
CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
举例:
create database demo character set utf8 collate utf8_general_ci;
数据库的character set和collation可通过INFORMATION_SCHEMA.SCHEMATA表查看。
⽐如下图,我创建了三个数据库test, test2, test3,test数据库的character set和collation分别为utf8和utf8_general_ci,⽽test2和test3数据库的character set和collation分别为latin1和latin1_swedish_ci。
也可以通过如下⽅式查看css教程div嵌套
USE db_name;
SELECT @@character_set_database, @@collation_database;
数据库级别的character set和collation会影响以下⾏为:
1. 创建表时,会默认使⽤database的character set和collation。
java中string2. 使⽤mysql的LOAD DATA加载数据时,默认采⽤database的character set和collation。
3. 作⽤于存储过程和函数,在创建存储过程和函数时,传递的参数默认采⽤database的character set。
⽐如我的database character set为latin1,然后我创建⼀个存储过程proc1(nameStr varchar(20)),当我调⽤存储过程call proc1('张三')时,会报错,因为存储过程proc1的参数只⽀持latin1字符集。
table级别
table的character set和collation可在创建表时指定,不指定默认采⽤database级别的。
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]
table级别的character set和collation会影响column级别的character set和collation,也就是column如果不指定character set和collation,就会默认继承table级别的。
菜鸟app官方下载要想查看表的character set和collation,可通过information_schema.TABLES表查看,不过这个表只保存了collation信息,但是通过collation我们就能知道character set是什么了。
或者通过如下命令查看
column级别
个人博客搭建代码指定column级别的character set和collation,只有column的类型为字符型,如char,varchar,text等时,才可指定character set和collation。
col_name {CHAR | VARCHAR | TEXT} (col_length)css提示框
[CHARACTER SET charset_name]
[COLLATE collation_name]
举例
CREATE TABLE t1
(
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_german1_ci
);
ALTER TABLE t1 MODIFY
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;mysql面试题及讲解
要查看列的character set和collation,可通过information_schema.COLUMNS表查看。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论