mysql字符集编码和排序规则
环境:
mysql 5.7 26
DBeaver 21.1.2.202107041908
参考:
javafx idea建议先阅读:
先说下结论:
如果你想在数据库中存储emoji表情等特殊字符,就需要设置数据库的字符集编码为utf8mb4,排序规则为utf8mb4_general_ci,并且连接字符串中也需要指定utf8mb4(对于nuget: MySqlConnector来说,默认就是utf8mb4,⽆须显⽰指定);
utf8mb4_general_ci是忽略⼤/⼩写的差别,所以不⽤担⼼因为⼤⼩写搜索不到数据的问题;
utf8mb4_general_ci是不能忽略全半⾓差别的,所以可能因为全半⾓的原因导致搜索不到数据。
⼀、说说字符集、字符集编码和排序规则
字符集:罗列所有图形字符的⼀张⼤表。
⽐如:
GBK字符集(中国制造): 罗列了所有的中⽂简体、繁体字的⼀张⼤表。
Unicode字符集(全世界通⽤):罗列了世界上所有图形字符的⼀张⼤表。
字符集编码:将字符集上罗列的图形字符存储到计算机中的⼀种编码规则。
⽐如:
GBK字符编码(中国制造):GBK本⾝既是字符集,也是编码规则;
UTF-16:存储Unicode字符集的⼀种编码规则,使⽤2个(中⽂)、4个(emoji表情)字节存储。
UTF-8:也是存储Unicode字符集的⼀种编码规则,使⽤1个、2个、3个、4个字节存储。
parameters在哪排序规则:定义各个图形字符之间的⼤⼩⽐较规则,⽐如:是否区分⼤⼩写,区分全⾓和半⾓等。
在软件使⽤中,⼀般我们只指定字符编码即可,因为确定了字符编码字符集⾃然就确定了。
但是在数据库类软件中,我们除了要指定编码规则,还需要指定排序规则,因为,数据库是要提供模糊匹配、排序显⽰功能的。
⼆、mysql中的字符集编码和排序规则
mysql共⽀持40多种字符集编码和200多个排序规则。
sqlserver中将字符集编码和排序规则合在⼀起了,指定了排序规则也就基本上确定了字符集编码(为什么说是基本上,因为sqlserver中还有nvarchar和varchar的区别,详见:)
如下sql可以查看mysql⽀持的字符集编码和排序规则,其中每个字符集编码都有⼀个默认的排序规则:
-- 查看所有的字符集编码和对应的默认排序规则
select*from information_schema.CHARACTER_SETS cs ;
-- 查看所有的排序规则
select*from information_schema.COLLATIONS c
注意:mysql中的utf8并不是真正的UTF-8编码,utf8mb4才是真正的UTF-8编码,我们在建数据库的时候记得使⽤utf8mb4⽽不是utf8。
三、mysql 中字符集编码设置的级别
mysql中共有4种级别的字符集编码的设置:Mysql Server级别、 数据库级别、表级别、列级别。
如果新建数据库时未指定字符集编码则使⽤Mysql Server级别的设置。逃离塔科夫卡在配置文件数据加载中
-- 创建数据库时指定字符集编码和排序规则
mysql怎么读英语CREATE DATABASE test2
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
如果新建表时未指定字符集编码则使⽤数据库级别的设置;
-- 创建表时指定字符集编码和排序规则
create table tt2(
addr varchar(50)
)character set utf8mb4 collate utf8mb4_general_ci;
如果新建列时未指定字符集编码则使⽤表级别的设置;
-- 创建表时指定某个列的字符集编码和排序规则
create table tt4(
编程语言近十年排行name varchar(50)character set utf16 collate utf16_general_ci,
addr varchar(50)
)character set utf8mb4 collate utf8mb4_general_ci;
查看当前数据库的字符集编码和排序规则:
select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
from information_schema.SCHEMATA s
where SCHEMA_NAME ='test2';
查看指定表的字符集编码和排序规则:
select TABLE_NAME,TABLE_COLLATION
from information_schema.TABLES t
where TABLE_SCHEMA ='test2'and TABLE_NAME ='tt2';
查看指定列的字符集编码和排序规则:
select c.TABLE_NAME,c.COLUMN_NAME,c.CHARACTER_SET_NAME,c.COLLATION_NAME
from information_schema.`COLUMNS` c
where c.TABLE_SCHEMA ='test2'and c.TABLE_NAME ='tt2'
四、mysql中会话环境的字符集编码设置
上⾯虽然讲了可以给mysql的数据库级别、表级别、甚⾄列级别设置字符集编码,但如果平时不注意,
仍然会出现乱码的情况!
⾸先看⼀个mysql连接回话中出现的编码设置:
show variables like'character_set%';
解释⼀下上⾯变量的意思:
character_set_client、character_set_connection、character_set_results是⼀个mysql连接后mysql客户端和mysql服务器协商的编码规
开发者工具接口执行异常则。character_set_client表名客户端使⽤何种字符集编码序列化⽂本字符,character_set_connection⼀般和character_set_client保持⼀致即可(受SELECT _utf8'abc'形式语句的影响,参见:),character_set_results表⽰服务端应该以何种编码返回⽂本。
character_set_database表⽰当前连接操作的数据库的字符集编码。
character_set_server表⽰mysql服务端的默认字符集编码。
character_set_system表⽰mysql存储元数据时使⽤的编码,固定为:utf8。
character_set_filesystem表⽰涉及到⽂件操作的时的编码,如:LOAD DATA INFILE和SELECT ... INTO OUTFILE语句和LOAD_FILE()函数中
对于我们程序员来说,新建数据库时选择字符集编码为utf8mb4,排序规则为utf8mb4_general_ci即可。
另外,如果你发现乱码的话,可以查看⾃⼰客户端声明的编码是多少,在c#中默认为utf8mb4(nuget: MySqlConnector),如:
注意:在MySqlConnector驱动包中,默认就是utf8mb4并且不能修改,如果你⽤的是Mysql.Data,那么你需要注意了,因为它默认的是latin1,如下:
此时,为了避免乱码,你就需要⼿动指定编码为utf8mb4,如下:
五、可以存储emoji表情吗?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论