MySQL中校验规则的选取对数据的影响

在mysql中存在着各种utf8编码格式,如下表:
1)utf8_bin
2)utf8_general_ci

utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

现在假设执行如下命令:
create table test_bin (
name varchar(32) not null primary key,
age int unsigned not null
) engine = InnoDB COLLATE=utf8_bin;
以上命令能够执行成功。

create table test_ci (
name varchar(32) not null primary key,
age int unsigned not null
) engine = InnoDB COLLATE=utf8_general_ci;

以上命令能够执行成功。
insert into test_bin values(‘Alice‘, 18);

以上命令能够执行成功。
insert into test_bin values(‘alice‘, 18);

以上命令能够执行成功,因为utf8_bin是以十六进制方式存储数据,两条记录的主键不重复。
insert into test_ci values(‘Alice‘, 18);

以上命令能够执行成功。
insert into test_ci values(‘alice‘, 20);
以上命令执行失败,因为utf8_general_ci不区分大小写,两条记录的主键重复。

因为校验规则不同,所以使用两种校验规则的非唯一列相同结果的排序结果也会不同。建议使用utf8_bin校验规则

mysql> select * from  test_paixu_ci order by name desc;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | huzj | hunan   |
| 12 | huzj | hunan   |
| 13 | Huzj | hunan   |
| 14 | huzj | hunan   |
| 15 | Huzj | hunan   |
| 16 | huzj | hunan   |
| 17 | HuzJ | hunan   |
| 18 | huzj | hunan   |
| 19 | HUZJ | hunan   |
| 11 | hUzj | hunan   |
| 10 | hUZj | hunan   |
|  2 | huzJ | hunan   |
|  3 | huzj | hunan   |
|  4 | huZj | hunan   |
|  5 | hUzj | hunan   |
|  6 | huZj | hunan   |
|  7 | huzj | hunan   |
|  8 | huZj | hunan   |
|  9 | hUzj | hunan   |
| 20 | hUzj | hunan   |
+----+------+---------+
20 rows in set (0.00 sec)

mysql> select * from  test_paixu_bin order by name desc;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | huzj | hunan   |
| 14 | huzj | hunan   |
| 16 | huzj | hunan   |
|  7 | huzj | hunan   |
| 12 | huzj | hunan   |
| 18 | huzj | hunan   |
|  3 | huzj | hunan   |
|  2 | huzJ | hunan   |
|  4 | huZj | hunan   |
|  8 | huZj | hunan   |
|  6 | huZj | hunan   |
| 11 | hUzj | hunan   |
|  9 | hUzj | hunan   |
|  5 | hUzj | hunan   |
| 20 | hUzj | hunan   |
| 10 | hUZj | hunan   |
| 13 | Huzj | hunan   |
| 15 | Huzj | hunan   |
| 17 | HuzJ | hunan   |
| 19 | HUZJ | hunan   |
+----+------+---------+
20 rows in set (0.00 sec)
时间: 2024-10-12 13:38:13

MySQL中校验规则的选取对数据的影响的相关文章

SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

原文:SQL Server 与MySQL中排序规则与字符集相关知识的一点总结 字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的基础上特定的字符排序方式,排序规则是基于字符集的,是对字符集在排序方式维度上的一个划分.排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的比如中文字符集,也即汉字,可以按照“拼音排序”.“

用命令从mysql中导出/导入表结构及数据

在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo table1 table2 > foo.sql这样就可以将数据库databasefoo的表table1,table2以sql形式导入foo.sql中,其中-uroot参数表示访问数据库的用户名是root,如果有密码还需要加上-p参数Eg: C:\Users\jack> mysqldump -uroo

MySQL中order by排序时,数据存在null咋办

order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用AngularJs集成了一个TableDnD开源插件,可以实现,然后在数据库表中增加一个排序字段indexId,但是原来的大量数据是没有排序过的,所以该字段为null. 这样order by时,为null的数据就会排在最前边. 写个测试表模拟一下,如下效果: 解决办法: 最优办法:利用MySQL中的一

浅谈mysql中不同事务隔离级别下数据的显示效果

事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行.也就是说,事务内的语句要么全部执行,要么一句也不执行. 事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性) automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行consisitency:一致性,事务执行前的总和和事务执行后

mysql中不同事务隔离级别下数据的显示效果--转载

事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行.也就是说,事务内的语句要么全部执行,要么一句也不执行. 事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性) automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行 consisitency:一致性,事务执行前的总和和事务执行后的总和是不变的

MySQL中游标使用以及读取文本数据

前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试过了.现在学习大数据分析,接触了数据挖掘,才感觉到数据库是不可跨越的坎.直到现在才感觉到<操作系统>.<编译原理>.<计算机组成原理>等等课程的重要性.在浩瀚的知识面前,个人是非常渺小的.掌握了一种思想之后,任何事情都不困难,困难的是你是否真的静下心看一看帮助文档.认真的Google.静心.静气.认真.执着. 游标-

oracle和mysql中update联表批量更新数据的区别

之前碰到一个sql语句,在oracle中可以运行,在mysql上就不行,后来查了好久,发现了他们两个联表批量更新数据的区别如下: (借鉴一下别人的例子) update :单表的更新不用说了,两者一样,主要说说多表的更新复制代码 代码如下: Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标 update ( select t.charger_id_ new_charger_id_ from t_cus_year_status t left

mysql中查询时间为空的数据

mysql表中datetime类型的字段名createtime,查询所有createtime为空的语句如下: select * from yy_business where ISNULL(createtime) is TRUEupdate yy_business set createtime='2015-01-21 17:24:58' where ISNULL(createtime) is TRUE

mysql中limit的用法详解[数据分页常用]

在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须是一个整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目.初始记录行的偏移量是