mysql校对规则_MYSQL校对规则

一、前言

有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录;

有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新了;

有时候遇到这种情况,你的查询语句一切正常,查询却失败了,报告Illegal mix of collations错误;

你很困惑,在想数据库是不是坏了。。。其实 ,这些都和数据库字符集的校对规则有关;了解了校对规则,你就知道怎样处理这些问题。

那么,校对规则是怎么回事呢?它是一组规则,负责决定某一字符集下的字符进行比较和排序的结果。

比如说,有latin1字符集中的字母A和a,我们需要它们在比较的时候相等,那么,我们可以使用字符集校对规则 latin1_general_ci;这种校对规则在比较和排序的时候不区分大小写;如果我们需要他们在比较的时候不等呢?也很简单,我们可以使用字符集校对规则latin1_bin;这种校对规则会以二进制的方式对字符进行比较,很明显,a和A的二进制编码不同,比较的结果就是不等。

上面的场景说明了校对规则在最简单情况下起的作用;实际情况与此并没有太多不同,只不过稍微有些复杂而已。

二、校对规则总览

我们可以使用SHOW COLLATION 指令来查看数据库支持的校对规则

4bd0a905cd44ec4c4731def4d662aa88.png

在图中,我们列出了数据库支持的latin1字符集的校对规则。为什么一种字符集竟然有这么多种的校对规则呢?因为在不同的情况下,对比较的结果有不同的期待,所以就有了不同的校对规则。前面说的大小写敏感(latin1_general_cs)和不敏感(latin1_general_ci)是两种校对规则,根据二进制方式进行比较(latin1_bin)也是一种校对规则,德国人(latin1_german1_ci)和西班牙人(latin1_spanish_ci)使用的某些不同的拉丁字符在某些情况下是等价的,所以有了两种新的校对规则。

举个例子,在latin1_german1_ci中,如下字符是等价的,而他们,具有不同的外形和编码。当然,它们的编码不同,所以在latin1_bin校对规则下,他们又是不等价的了。

A,a,À,Á,Â,Ã,Ä,Å,Æ,à,á,â,ã,ä,å,æ

三、校对规则导致的问题

1、混合校对规则比较

两个字符串比较,要求两者必须有相同的校对规则,或者两者的校对规则是相容的——所谓相容是指,两种校对规则优先级不同,比较的时候两者使用高优先级的校对规则进行比较,比如latin1_bin的优先级相对较高。

CREATE TABLE`tbl` (

`col_a`int(11) default NULL,

`col_b`char(20) character set latin1 collate latin1_general_ci default NULL,

`col_c`char(20) character set latin1 collate latin1_german1_ci default NULL,

`col_d`char(20) character set latin1 collate latin1_bin default NULL,KEY`col_a` (`col_a`),KEY`col_b` (`col_b`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1

在这个表中,col_b、col_c、col_d的校对规则各不同;其中,latin1_general_ci和latin1_german1_ci 校对规则同级,不能进行比较;如果强行比较的话,就会报错,如下:

mysql> select * from tbl where col_b =col_c;

ERROR1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_german1_ci,IMPLICIT) for operation '='

而latin1_general_ci和latin1_bin的优先级不同,latin1_bin高于latin1_general,因此比较的时候,会按照latin1_bin的规则进行比较。

mysql> select * from tbl where binary col_b =col_d;

Emptyset (0.00 sec)

当然,可以在sql语句中强制指定校对规则进行比较,下面这个例子就说明了这一点:

mysql> select * from tbl where col_b COLLATE latin1_danish_ci =col_c COLLATE latin1_danish_ci;

Emptyset (0.00 sec)

2、校对规则导致的问题——SELECT出错误的记录

在上面的基础上,我们要演示一个常见的问题;我们需要对该数据表进行一定的处理:

alter table tbl modify col_b collate latin1_swedish_ci default null;insert into tbl (col_b) values ('hao123');

然后进行下面的查询

3e3d1da28262d78d3ae321af53e18f31.png

我们希望查询的是包含“刘”的记录,hao123这个和“刘”没有任何关系的条目被选了出来,看起来很奇怪。

不过这不是数据库出了问题,而是校对规则的使用上存在问题:

下面是我们使用ultraedit察看字符串的二进制编码的结果,在gbk编码下,hao123的编码为68 61 6f 31 32 33,而刘的编码位C1 F5。

f48f5300ed50b9420cbaf35e3c4335cc.png

在前面的latin1_swedish_ci 校对规则中可以看到:

61和C1都与41等价

ca56b98d780c575b5d92f20e654e328b.png

6F和F5都与4F等价

2d728f2232ee614b0de026e8ae829429.png

这就是ao = 刘的原因。

解决办法有两个:

1)修改该字段的字符集和校对规则,改成gbk,这该问题不在存在。这是完美的解决方案,不过有些时候你没有权限对数据库进行这样的改动。

mysql> alter table tbl modify col_b char(20) charset gbk default null;

Query OK,1 row affected (0.01sec)

Records:1 Duplicates: 0 Warnings: 0mysql> select * from tbl where binary col_b like like '%刘%';

Emptyset (0.00 sec)

2)查询的时候声明校对规则为latin1_bin 。这样可以在一定程度上缓解这个问题;不过如果col_b中只要含有c1 f5,就会被选出来——而c1 f5可能恰好是另外两个字符的前半截和后半截,或者干脆就是 Á õ ....

mysql> select * from tbl where binary col_b like '%刘%';

Emptyset (0.00 sec)

转载:http://hi.baidu.com/cuttinger/item/e23013e372ee62adce2d4fda

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于NHibernate的留言本

留言本环境:access2003 vs2005 整个留言本的类视图: 1.新建一个空的解决方案 NHibernateMessage 依次建立项目Model,DAL,BLL,Command四个项目 2.Model项目处理 删除自动生成的class1.cs文件,新建message.cs文件其代码如下 Codeusing System;…

腾讯招.NET要求以下几点,你准备好了吗?

今天是大年初七,上班第一天,你在关注什么?2021年跳槽季可能是近10年来最火爆的跳槽季,各HR都在摩拳擦掌,新的征程已开始,.NET开发者们,也该行动起来了!上图是腾讯的.NET Core招聘标准…

不得了,日本出版社竟是这样吸引死宅学编程的

此前日本出版社“翔泳社”推出 IT 专业用语拟人化的 IT 说明书,将书中相关名词用萌妹子来表现,并对其性格等方面进行了设定。 比如 HTTP 酱由于在互联网上应用最为广泛,经常与大家见面,因此被设计成了偶像。她与其它协议有着很好的…

mysql表空间权限_MySQL InnoDB表空间加密示例详解

前言从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加密,加密用的是AES算法,而其解密是在从…

Dapr 正式发布 1.0

年前我写了一篇博客《Dapr 已在塔架就位 将发射新一代微服务》, 今天Dapr 正式发布了1.0 :Dapr Runtime v1.0.0Dapr dotnet SDK v1.0.0随着Dapr 发布1.0 版本, .NET团队编写的《Dapr for .NET Developers》:https://github.com/do…

100 万在中国不同地方能活多久?

最近,一张名为 “100 万在中国各省能生活多久?” 的图片在网上流传 话不多说,往下看 没错,就是正如你们看到的 天朝大北京 以“100万能活19年9个月”的 成绩排名“倒数第一” 图片一出 数据君虎口一震 顿时一声惊叫 统计按“年人均…

重磅:.NET 6 发布首个预览版

前言2021 年 2 月 17 日微软发布了 .NET 6 的 Preview 1 版本,那么来看看都有什么新特性和改进吧,由于内容太多了因此只介绍一些较为重点的项目。ASP.NET Core 6 Preview 1 和 EF Core 6 Preview 1 同样有很多的更新内容,但是限于篇幅就不在这…

UOS简单评测

一位网友安装了UOS系统,并录制了视频,这位网友告知,UOS使用中无卡顿,比较流畅。以下为机器的硬件配置。就操作系统最关键的软件生态而言,UOS自带40多款原创应用和一个有2000多款优质应用的商店,包括微信、Q…

今天,送你一份交通行业最全数据集(共享单车、自动驾驶、网约出租车、交通信号识别)

近几年来共享单车、自动驾驶等交通行业发展得如荼如火,小编也一直有意识地收集相关数据集,经过长时间的积累和沉淀,已经拥有将近300G的交通数据,内容涵盖国内外“自动驾驶”、“共享单车”、“网约出租车”、“交通信号识别”等方…

空谈Saas都扯淡,让你看看真正的云计算

最近“虚拟化”的话题似乎热度有所降低,而“云计算”的概念却不断升温,就连Vmware的新的服务器虚拟化产品,都要加上一个第一款“云计算”操作系统,而正如hubisheng兄弟在《名头不小!!VMware vSphere实为VI升…

前方高能 | 你写过什么有趣的程序?最后一个笑出猪叫

苍冥 说:我们从高一到高三都强制采用图形计算器,可以画函数图像的那种。我们用的是德州仪器系列,Ti-Nspire,贵的要死要死的。然而我却买错了计算器的制式,便宜货,相比其他同学的系统少了很多重要的功能。作…

鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -

鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -鼠标鼠标的故障分析与维修比较简单,大部分故障为接口或按键接触不良、断线、机械定位系统污垢等原因造成的。少数故障为鼠标内部元器件或电路虚焊造成的,这主要存在于某些劣质产品中,其中…

php mysql 云虚拟机_虚拟机+apache+php+mysql 环境安装配置

虚拟机的安装:直接下一步即可,注意修改路径。安装完成后新建虚拟机,直接下一步。如果选择镜像文件后出现错误,可以试着去修改电脑bios中的虚拟化设置,改为enable,如下图:apache安装:…

简单六步,用数据说服你的听众

“相比表格,利用数据图展现数据的方法有可观的优势。庞大的数据令人厌烦,普通人在其中根本获取不到有用的信息,就像从黄瓜里面汲取不到阳光一样。”——摘取自《Economic and Industrial Delusions》一书,作者Arthur Briggs Farqu…

CCNA第五章WAN连接

转载于:https://blog.51cto.com/centrevy/176434

探索 .NET Core 依赖注入的 IServiceCollection

如果您使用了.NET Core,则很可能已使用Microsoft.Extensions.DependencyInjection中的内置依赖项注入容器,在本文中,我想更深入地了解Microsoft Dependency Injection(DI)容器中的 IServiceCollection。什么是依赖注入…

看完这13张图,不得不佩服还是外国人会玩人工智能

对于程序员来说,机器学习领域无疑充满着巨大的诱惑和挑战,很多人对里面复杂的概念和算法头疼不已,那么,有没有一套对新手既友好又明了,对老手能加深印象,不断复习的学习办法呢?有,今…

EFCore查缺补漏(二):查询

相关文章: EFCore查缺补漏第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single query / Multiple queries / Fortunes 中落了下风,成绩远不如 dapper,更不如直…

如何在mysql中打开mongodb_图解:如何从MySQL移植到MongoDB

【IT168 技术】下图是使用 SQL 和 MongoDB 的对应信息图表,点击图片查看大图:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似…

仿真模拟,需要注意这几点!

周日晚上的直播甚是精彩先是潘同学分享了获奖论文和解题技巧接着是董同学分享了论文的写作小技巧po几张截图让大家感受下此时此刻可能会有不少童鞋正在为错过直播而懊悔不用担心超模君还准备了一份豪华大礼本周超模君特意邀请到今年美赛D题特等奖获奖者谢挺同学(获奖…