【MySQL】数据库字符校对规则

一 什么是字符校对规则
使用MySQL的大多数都知道字符集是一套符号和编码,而对校验本规则不太熟悉。校对规则是在字符集内用于比较字符的一套规则,可以控制 select 查询时where 条件大小写是否敏感的规则.如字段 col 在表中的值为 'abc','ABC','AbC' 在不同的校对规则下,where col='ABC'会有不同的结果。
系统常用的字符校对规则

校对规则有如下特征:
a 两个不同的字符集不能有相同的校对规则。
b 每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8generalci
c 存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名比如utf8,并且以ci(大小写不敏感)、或bin(二元)结束 ,如 utf8_bin。

提示:
官方文档上说是有 cs(大小写敏感) 但是show collation like 'utf8%'; 并没有cs结尾的校对规则。

二 如何使用字符校对规则
MySQL 提供四种默认级别的字符集和校验规则:服务器级、数据库级、表级,和连接级,一般字段级别的不常用。
2.1 服务器级
MySQL服务器有一个服务器字符集和一个服务器校对规则,collationserver的默认字符集是在编译mysql的时候编译好的,比如
shell> ./configure --with-charset=utf8
或者:
shell> ./configure --with-charset=utf8 \
--with-collation=utf8generalci
如要要修改默认的字符校对规则,我们可以通过以下几种方式:
a 在/etc/my.cnf 的[mysqld]中添加
collationserver = utf8bin
修改之后必须重启
root@rac2 [(none)]> show variables like 'collation%';
+----------------------+-----------------+
| Variablename | Value |
+----------------------+-----------------+
| collationconnection | utf8generalci |
| collationdatabase | utf8bin |
| collationserver | utf8bin |
+----------------------+-----------------+
3 rows in set (0.00 sec)

b 通过mysqld 命令行添加 --character-set-server=utf8 --collation-server=utf8generalci
/usr/sbin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/home/mysql/data3306/data --log-error=/home/mysql/data3306/log/master-error.log --pid-file=/home/mysql/data3306/data/rac3.pid --socket=/tmp/mysql.sock --port=3306 --character-set-server=utf8 --collation-server=utf8generalci &

注意:这篇文章描述的并不准确
https://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-column
通过
shell> mysqld --default-character-set=utf8 \
--default-collation=utf8generalci
方式启动会报错
140430 9:34:56 InnoDB: 1.1.8 started; log sequence number 1628178
140430 9:34:56 [ERROR] /usr/sbin/mysqld: unknown variable 'default-character-set=utf8'
140430 9:34:56 [ERROR] Aborting

服务器级别字符集校对规则
root@rac2 [(none)]> show variables like 'collation%';
+----------------------+-----------------+
| Variablename | Value |
+----------------------+-----------------+
| collationconnection | utf8generalci |
| collationdatabase | utf8bin |
| collationserver | utf8_bin |
+----------------------+-----------------+
root@rac2 [dba]> create table t1(col varchar(5)) engine=innodb ;
Query OK, 0 rows affected (0.10 sec)
root@rac2 [dba]> insert into t1 values('abc'),('ABC'),('AbC');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
root@rac2 [dba]> select * from t1 where col='ABC';
+------+
| col |
+------+
| ABC |
+------+
1 row in set (0.01 sec)
root@rac2 [dba]> create table t2(col varchar(5)) engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.11 sec)
root@rac2 [dba]> insert into t2 values('abc'),('ABC'),('AbC'); 
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
root@rac2 [dba]> select * from t2 where col='ABC';
+------+
| col |
+------+
| abc |
| ABC |
| AbC |
+------+
3 rows in set (0.00 sec)

2.2 数据库级别字符校对规则
每一个数据库有一个数据库字符集和一个数据库校对规则。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
CREATE DATABASE dbname
[[DEFAULT] CHARACTER SET charsetname]
[[DEFAULT] COLLATE collation_name]
通常如果创建数据库的时候不指定db的字符集和校对规则,则使用服务器级别默认的校对规则。
如何修改数据库级别的字符校对规则:
   a 通过在创建数据库时指定 collationdatabase 字符集。
   b 通过ALTER DATABASE dbname [[DEFAULT] CHARACTER SET charsetname] [[DEFAULT] COLLATE collationname]
注意 在my.cnf 中的[mysql]或者[mysqld]中配置 
collationdatabase=utf8_bin
会分别报错:
mysql: unknown variable 'collationdatabase=utf8_bin' 
140430 13:56:19 [ERROR] /usr/sbin/mysqld: unknown variable 'collation_database=utf8_bin'
140430 13:56:19 [ERROR] Aborting
例子 
root@rac2 [(none)]> show variables like 'collation%';
+----------------------+-----------------+
| Variablename | Value |
+----------------------+-----------------+
| collationconnection | utf8generalci |
| collationdatabase | utf8bin |
| collationserver | utf8_bin |
+----------------------+-----------------+
3 rows in set (0.00 sec)
root@rac2 [(none)]> create database dba01;
Query OK, 1 row affected (0.00 sec)
root@rac2 [(none)]> use dba01
Database changed
root@rac2 [dba01]> CREATE TABLE t1(col varchar(5)) ;
Query OK, 0 rows affected (0.09 sec)
root@rac2 [dba01]> insert into t1 values('abc'),('ABC'),('AbC');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
root@rac2 [dba01]> select * from t1;
+------+
| col |
+------+
| abc |
| ABC |
| AbC |
+------+
3 rows in set (0.00 sec)
root@rac2 [dba01]> select * from t1 where col='abc';
+------+
| col |
+------+
| abc |
+------+
1 row in set (0.00 sec)
MySQL这样选择数据库字符集和数据库校对规则:
  如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校对规则Y。
  如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。否则,采用服务器字符集和服务器校对规则。

2.3 表级别的校对规则
   每一个表有一个表字符集和一个校对规则,为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:
CREATE TABLE tblname (columnlist)
[DEFAULT CHARACTER SET charsetname [COLLATE collationname]]
ALTER TABLE tblname
[DEFAULT CHARACTER SET charsetname] [COLLATE collationname]
例子:
root@rac2 [dba00]> CREATE TABLE t3(col varchar(5)) DEFAULT CHARACTER SET utf8 COLLATE utf8bin ;
Query OK, 0 rows affected (0.12 sec)
root@rac2 [dba00]> insert into t3 values('abc'),('ABC'),('AbC');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
root@rac2 [dba00]> select * from t3;
+------+
| col |
+------+
| abc |
| ABC |
| AbC |
+------+
3 rows in set (0.00 sec)
root@rac2 [dba00]> select * from t3 where col='abc';
+------+
| col |
+------+
| abc |
+------+
1 row in set (0.01 sec)
MySQL按照下面的方式选择表字符集和 校对规则:
   如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
   如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。
   否则,采用服务器字符集和服务器校对规则。
   如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。表字符集和校对规则是MySQL的扩展;在标准SQL中没有。

2.4 连接字符集和校对规则详见 
文档 https://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-connection。

三 总结
    数据库查询使用校对规则的优先级 列>表>数据库>服务器,缺省情况下会继承当前字符集所对应默认的字符集校对规则,对于想要在查询的时候区分大小写情况而使用校对规则的话,最好创建数据库和表的时候 就指定好期望的字符校对规则。
   对于云产品的RDS 小白客户,显然有些难了,需要使用文档来指引。
  当然作为程序员或者DBA 一定要使用自己熟悉的知识,或者使用之前一定要做好足够的了解,线上无小事。。

时间: 2025-01-21 07:44:24

【MySQL】数据库字符校对规则的相关文章

修改MySQL数据库字符编码为UTF-8解决中文乱码

问题: 由于MySQL编码原因会导致数据库出现乱码. 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 mysql -uroot -p #输入密码进入 status; #查看当前MySQL运行状态,如下图所示: 系统运维  www.osyunwei.com  温馨提醒:系统运维原创内容版权所有,转载请注明出处及原文链接 Server characterset: latin1 Db characte

MySQL字符集和校对规则(Collation)

MySQL字符集和校对规则(Collation) 阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对规则 一.字符集(Character set) 是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,字符集种类较多,每个字符集包含的字符个数不同. 特点: ①字符编码方式是用一个或多个字节表示字符集中的一个字符 ②每种字符集都有自己特有的编码方

MySQL权限系统之权限知识和管理:校对规则\列表\帐号

本篇文章将会讲述MySQL的权限校对规则.权限项列表,以及会从数据库帐号和权限的设置层面,讲述如何使我们的数据库访问或数据操纵更安全. 帐号信息校验规则 客户端向mysql数据库服务器端发送的连接请求是否成功,除了网络.防火墙等因素制约其能否访问到服务器外,最重要的是必须提供五个参数信息:客户端的IP地址或主机名称.数据库服务器的IP地址或http://www.aliyun.com/zixun/aggregation/12321.html">网络域名.数据库访问的帐号和对应的密码,以及数据

向mysql数据库插入图片出现乱码

问题描述 做了一个小程序,向mysql数据库中插入图片,并且可以显示图片.我的mysql数据库字符编码是gbk,eclipse默认的字符编码也是gbk. 查询语句:insert =conn.prepareStatement("insert into img_table (name,data) values (?,?)", Statement.RETURN_GENERATED_KEYS); 开始连接数据库的url是jdbc:mysql://localhost:3306/test .出现错

查看MySQL数据库编码与编码字典命令

以下是查看或设置MySQL数据库相关编码的常用命令: 查看MySQL数据库字符编码 show variables like 'character%'; 查看MySQL数据库字符编码字典 show variables like 'collation%';

MySQL数据库varchar的限制规则说明_Mysql

MySQL数据库中varchar最大长度是多少?其实这不是一个固定的数字,varchar的长度是有限制规则的.本文我们就来介绍一下MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,接下来就让我们一起来了解一下这部分内容. 1.限制规则 字段的限制在字段定义的时候有以下规则: a)存储限制 varchar字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535. b)编码长度限制 字

mysql的校对规则引起的问题分析_Mysql

问题是这样的: 一张test的表,字符集采用的latin1. select to_id from test where to_id='cn象_王'; +---------------+ | to_id | +---------------+ | cn陶_陶 | | cn象_王 | +---------------+ 2 rows in set (0.00 sec) 取cn象_王的数据,居然把cn陶_陶的数据也取回来了. 这显然是不允许的. 查看它们的编码: (root@im_offlog1a:)

mysql数据库中文乱码应该怎么解决,修改配置文件中的字符编码并没有作用

问题描述 mysql数据库中文乱码应该怎么解决,修改配置文件中的字符编码并没有作用 mysql数据库中文乱码应该怎么解决,修改配置文件中的字符编码并没有作用. 解决方案 把当前数据库字符集改为utf8试一下. 解决方案二: 可以设置当前文本编码,与数据库一致 解决方案三: 先把文本粘贴到记事本,然后改成utf-8 保存后再粘贴回去

mysql数据库的字符编码设置

默认登录mysql之后show variables like '%character%', 出现 mysql> show variables like '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_c