📜  MySQL中的排序规则和字符集是什么?

📅  最后修改于: 2021-08-27 05:34:00             🧑  作者: Mango

对于MySQL学习者来说, MySQL排序规则一直是一个神秘的话题。一个MySQL归类是良好定义的组,其被用于通过使用其相应的编码进行比较的特定字符集的字符的规则。 MySQL中的每个字符集都可能具有多个排序规则,并且至少具有一个默认排序规则。两个字符集不能具有相同的排序规则。

  • 字符集是一组特定的符号和编码技术。排序规则是一组用于比较字符集中的字符的规则。字符集使我们可以通过各种字符集存储数据,并根据各种归类进行比较。我们可以在服务器,数据库,表和列级别突出显示字符集。
  • 假设我们有一些字母,分别是A,B,C,D,a,b,c,d。我们为所有字母分配了一个数字,例如A = 1,B = 2,C = 3,D = 4,a = 5,b = 6,c = 7,d = 8。因此,对于符号A编码为1,对于B编码为2,对于C编码为3,依此类推。如果我们要比较字符串A,B,a,b。我们有一个更简单的方法来执行此操作,刚才我们为一些字母分配了一个不同的值,例如A的编码为1,B的编码为2,a的编码类似,b的编码为5和6。能够进行此比较,只是因为排序规则。我们将Collation(比较相应的编码)技术显式地应用于我们的字符集。
  • 字符集不仅影响数据存储,而且影响客户端程序与MySQL服务器之间的通信介质。如果希望客户端程序使用与默认字符集不同的字符集与服务器进行通信,则需要突出显示您正在使用哪个字符集。例如,要使用utf8 Unicode字符集,请在建立连接到服务器后使用以下语句:
SET NAMES 'utf8'; 

有一条MySQL语句可了解有关字符集的默认排序规则,如下所示:

SHOW CHARACTER SET;

mysql中的字符集

字符集

  • 默认情况下,SHOW CHARACTER SET语句显示所有可用的字符集。但是,如果要访问特定类型的字符集,则需要使用MySQL的LIKE或WHERE子句,该子句指示哪些字符集名称符合条件。以下示例显示了一些与格式(’utf%’)匹配的Unicode字符集:

使用like语句获取字符集

使用LIKE语句获取字符集

  • 如果您想拥有特定或给定字符集的所有归类,那么MySQL提供了一条如下所示的SHOW COLLATION语句:
SHOW COLLATION LIKE 'character_set_name%';


使用WHERE语句获取字符集

使用WHERE语句获取排序规则

  • 在上表中,排序规则以_ci结尾,此处的ci表示不区分大小写。可能还有其他类型的归类,例如:
1.  _cs(Case-sensitive) ,
2.  _bin(Binary) 
  • MySQL查询数据库级别的字符集和排序规则的设置:如果在创建时未指定字符集,则数据库使用默认字符集,但是如果要分配特定的字符集,则可以可以通过MySQL查询显式表达它:
CREATE DATABASE name_of_database
CHARACTER SET character-set_name;
COLLATE collation_name;

例子:

CREATE DATABASE my_database
CHARACTER SET utf8mb4
COLLATE utf8_unicode_ci;

您还可以使用MySQL’ALTER’语句更改或应用数据库的字符集和排序规则名称:

ALTER DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name; 

例子:

ALTER DATABASE my_database
CHARACTER SET utf8mb4
COLLATE  utf8mb4_0900_ai_ci;

MySQL查询表级别的字符集和排序规则的设置:您还可以在创建表时显式指定所需的字符集和排序规则的类型,但是如果不指定,则使用默认字符-set和collation将被应用。

CREATE TABLE table_name(
ID   INT   AUTO_INCREMENT  NOT NULL,
NAME VARCHAR (20)     NOT NULL,
ADDRESS  CHAR (25) ,
SALARY   DECIMAL (18, 2),        
PRIMARY KEY (ID) );
CHARACTER SET character_set_name
COLLATE collation_name ;
  • 如果在通过MySQL’ALTER’语句创建表时尚未应用字符集和归类名称,则还可以选择设置字符集和归类名称:
ALTER TABLE table_name(
RENAME COLUMN old_name TO new_name);
CHARACTER SET character_set_name
COLLATE collation_name;
  • 您还可以在列级别设置字符集和排序规则名称:如我们所知,表中的列可能包含各种数据,例如(varchar,Int,float)。因此,您可以根据需要为不同类型的列(数据类型)显式指定字符集和排序规则名称。
ALTER TABLE table_name
MODIFY column_name   VARCHAR(25)
CHARACTER SET latin1;