欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql字符集设置_MySQL

程序员文章站 2022-03-26 16:13:33
...
最近一直在弄一个有关 mysql proxy 的项目,中间涉及到对 sql 语句的解析。之前对 mysql 了解的并不是太多,随着项目的推进,不得不补补了。今天突然看到 mysql 的 charset 设置,自己很多地方都没法解释清楚,对一些相关的 sql 语句背后的工作机制一知半解,于是找了点资料补习下,顺便做点儿笔记。

一、字符集和校对规则

字符集是一套符号和编号。校对规则是在字符集内用于比较字符的一套规则。

字符( character) 是人类 语言中最小的表义符号。例如字母 ’A’、’B’等;给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码 (Encoding) 。例如,我们给字符 ’A’赋予数值 0 ,给字符 ’B’赋予数值 1 ,则 0 就是字符 ’A’的编码, 1 就是字符 ’B’的编码;给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集 (Character Set) 。

校对规则 (collation) 是指在同一字符集内字符之间的比较规则;确定校对规则后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;每个校对规则唯一对应一种字符集,但一个字符集可以对应多种校对规则,其中有一个是默认校对规则 (Default Collation) 。

mysql 能够做这些事情:

  • 使用多种字符集来存储字符串
  • 使用多种校对规则来比较字符串
  • 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字 符串
  • 允许定义任何级别的字符集和校对规则

二、mysql 的字符集和校对

mysql 服务器能够支持多种字符集,可以使用 show character set; 语句列出可用的字符集:

mysql字符集设置_MySQL

要想列出校对规则可以使用 show collation; 语句:

mysql字符集设置_MySQL

两个不同的字符集不能有相同的校对规则;另外, mysql 中的校对规则名称遵从命名惯例:它们以对应的字符集名称开头;以 _ci( 大小写不敏感 ) 、 _cs( 大小写敏感 ) 或 _bin( 按编码值比较 ) 结尾。

mysql 的字符集和校对规则有 4 个级别的默认设置:服务器级、数据库级、表级和连接级。

1 、服务器字符集和校对

mysql 服务器有一个服务器字符集和一个服务器校对规则,它们均不能设置为空。

mysql 按照如下方法确定服务器字符集和服务器校对规则:

  • 当服务器启动时根据有效的选项设置
  • 根据运行时的设定值

当启动 mysqld 时,根据使用的初始选项设置来确定服务器字符集和校对规则。可以使用 --default-character-set 设置字符集,并且可以在字符集后面为校对规则添加 --default-collation 。如果没有指定一个字符集,那就与 --default-character-set=latin1 相同。如果仅指定了一个字符集(例如, latin1 ),但是没有指定一个校对规则,那就与 --default-charset=latin1 --default- collation=latin1_swedish_ci 相同,因为 latin1_swedish_ci 是 latin1 的默认校对规则。因此,以下三个命令有相 同的效果:

shell> mysqldshell> mysqld --default-character-set=latin1shell> mysqld --default-character-set=latin1 --default-collation=latin1_swedish_ci