mysql 字符集

Posted AHAU航哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 字符集相关的知识,希望对你有一定的参考价值。

mysql支持使用不同的字符集存储数据,支持四个级别的字符集设置:server、database、table 和 column。 MyISAMMEMORY, and InnoDB 三个存储引擎都支持不同的字符集设置。

本文参考:mysql 官网 http://www.mysql.com/ 

 

一、字符集和比对规则

字符集(character set):是一组符号和编码

比对规则(collation):是一组字符比对的规则

举例:

假设 A=0 , B=1 ,a=2, b=3。那么其中A 就是一个符号,0就是一个编码。 4个字母和他们编码的总和被称为字符集。

1.如果我们想要比较字符 A 和 B的大小,那么我们使用他们的编码 0 和 1 进行比较,得A<B。

这种比对规则 只包含了一种规则(编码的比较),我们称之为二进制比对规则。

2.如果我们不区分大小写,那么A 是=a的。

这种比对规则包含了两种规则,1)大小写字母相等。 2)比较编码。我们称之为大小写敏感的比对规则

但是,在实际生活中,字符集都包含大量的字母和符号。比对规则也包含众多的规则。

 

mysql可以做什么呢?

1)使用不同的字符集来存储字符。

2)使用不同的比对规则来进行字符的比较。

3)在同一台服务器、数据库甚至数据表中,混合使用不同的字符集。

 

二、mysql 中支持的字符集和比对规则

安装好mysql server之后,可以通过两种方式来查看其支持的character sets 和 collation。

1)查看系统表:INFOMATION_SCHEMA   CHARACTER_SETS

2)使用命令:SHOW CHARACTER_SET (可跟 like where 条件表达式)

一套字符集可能会使用多种比对规则,查看方法如下:

1)查看系统表:INFOMATION_SCHEMA   COLLATIONS

2)使用命令:SHOW COLLATION  (可跟 like where 条件表达式)

 

三、在mysql中指定字符集和比对规则

Server character set 和 collation-server(服务器级别的字符集)
1.启动服务时指定
Mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
2.配置文件指定
[mysqld]
character-set-server=latin1
collation-server=latin1_swedish_ci

Database character set 和 collation (数据库级别)
1.创建时
Create database db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

2.修改时
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
注:所有的database options 都保存在database文件的 db.opt 文本文件中

查看当前数据库设置的字符集信息

USE db_name;
SELECT @@character_set_database, @@collation_database;

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ‘db_name‘;

Table character set 和 collation (表级别)

同database level

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]

 

Column character set 和 collation (列级别)

col_name {CHAR | VARCHAR | TEXT} (col_length)

    [CHARACTER SET charset_name]

    [COLLATE collation_name]

 

Examples:

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;

 

字符串的 character 和 collation (普通字符串级别)

Select ‘string’ 使用的是character_set_connection 指定的字符集

字符 的 字符集指定语法

[_charset_name]‘string‘ [COLLATE collation_name]

Examples:

SELECT ‘abc‘;

SELECT _latin1‘abc‘;

SELECT _binary‘abc‘;

SELECT _utf8‘abc‘ COLLATE utf8_danish_ci;

 

四、client-server 程序交互涉及到的字符集和比对规则

数据最终的存储编码

1.系统变量Character_set_server和 collation_server 设置服务器程序的字符集及比对顺序

 

1.系统变量character_set_database和collation_database 标识了数据库默认的字符集

Client 和 server 进行信息交互所使用的编码

1.系统变量character_set_client标识了客户端程序发送到服务端程序所使用的字符集

2.Server使用 character_set_connection 和collation_connection 标识的字符集来翻译来自client的sql 命令

3.Character_set_results:server返回执行结果所使用的编码

 

Client 程序所使用的字符编码

注:默认使用OS上的默认编码。若、mysql不支持OS默认编码,则使用mysql默认编码latin1

编码修改方法:

1. client 启动时,增加选项 --default-character-set=char-name

2. 配置文件my.ini中指定

[mysql]

Default-character-set=char-name

注:此时c-s交互编码会自动被设置为 以上编码

















以上是关于mysql 字符集的主要内容,如果未能解决你的问题,请参考以下文章

带有神秘附加字符的 Javascript Date getTime() 代码片段

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

21个常用代码片段

使用 json rereiver php mysql 在片段中填充列表视图