数据表用来存储和检索数据,不同的语言和字符集需要以不同的方式存储和检索,因此MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法
由于对于不同的行,使用不同的排序方式会产生不一样的结果,如obGE,obge,OBGE,在使不使用区分大小写排序时会产生不同的结果,而且会影响排序和搜索,更何况对于不同国家的字符,因此使用校对很重要。
常用术语:
字符集:字母和符号的集合
编码:某个字符集成员的内部指令
校队:规定字符如何比较指令
在MySQL的正常数据库活动(select、insert等)中,不需要操心太多的东西,使用何种字符集和校对的决定在服务器、数据库和表级进行。
一、查看MySQL支持众多的字符集
-- 为查看所支持的字符集完整列表
show character set;
![cb06fdf97783772225c3282e935e0494.png](https://i-blog.csdnimg.cn/blog_migrate/c3ed430279a7c1d87e87a4977b4783df.jpeg)
上述显示了所有可用的字符集以及每个字符集的描述和默认校对
-- 查看可用的校对
show collation;
![b1797bd0cb0434776a37ec8a413aeb95.png](https://i-blog.csdnimg.cn/blog_migrate/cd14c0d3498d081ead9cc69b51dd4484.jpeg)
上述显示所有可用的校对,以及它们适用的字符集,而且其中有的字符集不止一校对
通常系统管理在安装时定义一个默认的字符集和校对。也可以在创建数据库时,指定默认的字符集和校对。
-- 为了确定所有的字符集和校对
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
![b3af31d0f7c8d7f7d962351365d0adb3.png](https://i-blog.csdnimg.cn/blog_migrate/d187f876ad632ed4ff3a4d3e1b880e79.jpeg)
二、使用字符集和校对顺序
实际上,字符集很少是服务器的范围(甚至数据库范围)的设置,不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建时指定
one、指定字符集和校对在表的范围
-- 给表指定字符集和校对 在创建的时候指定
mysql> create table obge_table
-> (
-> column1 int,
-> column2 varchar(10)
-> )default character set hebrew
-> collate hebrew_general_ci;
上述包含一个两列的,并且指定了一个字符集合一个校对顺序
![d5817085a14bb9df047e73af9a89f03b.png](https://i-blog.csdnimg.cn/blog_migrate/1d73f78bce96e1c13b080740fdaf92a4.jpeg)
注意:
1、如果指定CHARACTER SET 和COLLATE 两者,则使用这些值
2、如果只指定character set ,则使用此字符集及其默认的校对(也就是 show character set 结果中显示的)
3、如果既不指定character set 也不指定 collater 则使用数据库默认
two、指定字符集和校对在列的范围
-- 对一个表以及一个特定的列指定了character set 和 collate
mysql> create table obgestu.obge_table
-> (
-> columns int,
-> column1 varchar(10),
-> column2 varchar(10) character set utf8 collate utf8_general_ci
-> )default character set hebrew collate hebrew_general_ci;
![fc1127232ae0737faad4db2b784b3fca.png](https://i-blog.csdnimg.cn/blog_migrate/c3ca38582121416194f7b598e32b6c9f.jpeg)
Three 、在查询时指定校对顺序
校对在对用order by 子句检索出来的数据排序时起重要的作用,如果需要用与创建表时不同的校对顺序 排序特定的select 语句,可以在select 语句自身中进行
latin1 对于不同的欧洲语言有几种校对,而且许多校对出现两次,
一次区分大小写(由_cs表示),
一次不区分大小写由(_ci 表示)
![c6967a3a0a7917e91328002cd3bc24b7.png](https://i-blog.csdnimg.cn/blog_migrate/a746583919a8735add75d1657d00f067.jpeg)
字符集
![e60ebd0636e55918de9c06ae3c3dbcc9.png](https://i-blog.csdnimg.cn/blog_migrate/20cae7718526f6c5bd16466e3698a078.jpeg)
-- 为区分大小写校对
select * from customers order by last_name,first_name collate latin1_general_cs;
select 使用collate 指定一个备用的校对顺序,将会影响到结果的排序次序。
注意:
1、在不区分大小写的表上进行区分大小写搜索可以,反之也可以
2、collate 除了可以在order by 子句中使用外,还可以用于 group by、having、聚集函数、别名等
3、如果觉得需要可以使用 Cast() 或 Convert() 函数,将 串 与字符集进行转换