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招聘标准…

python设置字符间距_python字符串处理以及字符串格式化

一、python字符串处理目录:1.算长度(len),某个元素出现的次数(count)2.切片 [ ],repr:把不可见字符显示出来3.查找 #find,rfind从右边查找4.字符串和列表之间的转换(split,join list)5.替换字符串replace #替换会生成新的字符串,原来的字符串不变6.类型转换7.编…

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

此前日本出版社“翔泳社”推出 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…

帮助别人是一种快乐!

帮助人是一种快乐!忽然之间想起的这种话题。其实,还是缘于最近看的一篇商界人物的文章《杨卓舒》其实,这些字眼一直都在我们的眼帘前晃荡,更多的人只是顿悟而已,也许还有人帮助过一次,获得了一次短暂的快乐…

python中x 1什么意思_Python:A [1:]中x的含义是什么?

这是array slice语法.看到这个问题:Explain Python’s slice notation对于列表my_list对象,例如[1,2,“foo”,“bar”],my_list [1:]相当于从0索引1开始的所有元素的浅复制列表:[2,“foo”,“bar”].所以你的for语句遍历这些对象:…

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

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

JAVA跟MYSQL数据库交互_【编写Java程序实现与Mysql数据库的连接,并交互性的实现简单查询,删除,修改,排序,显示等操作】...

目前博主只实现了查询和插入,而且还不太会在面板对数据库语句进行更新,写完再看感觉语言有些冗杂,往后再更,大半夜写这个也是醉了呢。import javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListe…

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

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

热键与快捷键

热键及快捷键(GtkAccelGroup) 热键:一般是字母带下划线.在当前控件内(如打开的菜单)可以用alt字母来代替点击的功能快捷键:一般指,在本窗口任何位置内,按某组合键,都可以代替点击的功能.:) 如果你的理解与我的有冲突,请以我的理解为准!试举例证:#include #include const char *…

python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

本文在上文的基础上重新实现支持多线程的服务器。以下为TCP客户端的程序代码:#!/usr/bin/env python3import sysfrom PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice,QRegExp, Qt)from PyQt5.QtWidgets import (QApplication, QDateEdit, QFrame,…

巧合?模仿还是抄袭?水木年华的《秋日恋歌》和Lube 乐队的《Pozovi Menya Tiho Po Imeni》...

今天听到了俄罗斯的Lube 乐队的《Pozovi Menya Tiho Po Imeni》,前奏感觉很好熟悉,继续听,有种似曾相识的感觉,曲风和演唱风格都很熟悉,我极力的回忆,依稀想起水木年华有一首《莫斯科的黄昏》的演唱风格是在…

UOS简单评测

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

python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

1.轮廓发现轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。1.1发现轮廓在此步骤中我们会使用到findContours这个API,其原型为:cv2.findContours(image, mode, method[, contours[, hier…

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

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

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

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

重要的是改变命运,而非升职加薪

阅读本文大概需要4分钟。写公众号以来,被问的最多的问题就是工作选择。在这件事上,很多读者明显会更重视薪资、福利、Title,而不是:未来会怎么样。就在昨天,又有一个读者问我Offer选择的问题,给出建议后&am…

python中的成员运算符是干嘛的_在Python中使用成员运算符的示例

下表列出了所有Python语言支持的成员运算符。例如:试试下面的例子就明白了所有的Python编程语言提供会员运算符:#!/usr/bin/pythona 10b 20list [1, 2, 3, 4, 5 ];if ( a in list ):print "Line 1 - a is available in the given list"else…