正文

大家在使用mysql过程中,可能会遇到类似以下的问题:

模糊匹配 jg%,结果以JG开头的字符串也出现在结果集中,大家很自然的认为是大小写敏感的问题。那么mysql中大小写敏感是如何控制的;数据库名,表名,字段名这些字典对象以及字段值的大小敏感是如何控制的;以及校验规则与索引的关系,这是本文要讨论的内容。

数据库名、表名:

windows建库:

windows建表:

linux建库:

linux建表:

以上可以看出windows下大小写不敏感,linux下是敏感的,故前者不可以同时建test和TEST,而后者可以。

大小写区分规则:

Linux下:

  • 数据库名与表名是严格区分大小写的;

    • 表的别名是严格区分大小写的;
    • 列名与列的别名在所有的情况下均是忽略大小写的;
  • 变量名也是严格区分大小写的;

Windows下:

  • 都不区分大小写。

Mac OS下,文件系统类型HFS+,非UFS卷:

  • 都不区分大小写。

mysql中控制数据库名和表名的大小写敏感由参数lowercasetable_names控制,为0时表示区分大小写,为1时,表示将名字转化为小写后存储,不区分大小写。

在mysql中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。

lowercasefile_system:

变量说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。

lowercasetable_names:

unix下默认值为 0 ;Windows下默认值是 1 ;Mac OS X下默认值是 2

*0:*使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母在硬盘上保存表名和数据库名。名称比较对大小写敏感。在大小写不敏感的操作系统如windows或Mac OS x上我们不能将该参数设为0,如果在大小写不敏感的文件系统上将此参数强制设为0,并且使用不同的大小写访问MyISAM表名,可能会导致索引破坏。

*1:*表名在硬盘上以小写保存,名称比较对大小写不敏感。MySQL将所有表名转换为小写在存储和查找表上。该行为也适合数据库名和表的别名。该值为Windows的默认值。

*2:*表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母进行保存,但MySQL将它们转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注释:只在对大小写不敏感的文件系统上适用innodb表名用小写保存。

windows上:

linux上:

为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。

字段名和字段值:

字段名通常都是不区分大小写的。

字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则,比如定义'A'<'B'这样的关系的规则。不同的字符集有多种校对规则,一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以ci(大小写不敏感)、cs(大小写敏感)或bin(二元)结束 。比如 utf8字符集,utf8generalci,表示不区分大小写,这个是utf8字符集默认的校对规则;utf8generalcs表示区分大小写,utf8bin表示二进制比较,同样也区分大小写。

校对规则通过关键字collate指定,比如创建数据库test2,指定字符集为utf8,校对规则为utf8_bin

create database test2 default character set utf8  collate utf8_bin;

通过上述语句说明数据库test2中的数据按utf8编码,并且是对大小写敏感的。

有时候我们建库时,没有指定校对规则校对时字符大小写敏感,但是我们查询时,又需要对字符比较大小写敏感,就比如开篇中的例子,只想要jg开头的字符串。没关系,mysql提供了collate语法,通过指定utf8_bin校对规则即可。

还有另外一种方法,通过binary关键字,将串转为二进制进行比较,由于大小写字符的二进制肯定不同,因此可以认为是区分大小的一种方式。

校对规则与索引存储的关系。因为校对规则会用于字符串之间比较,而索引是基于比较有序排列的,因此校对规则会影响记录的索引顺序。下面举一个小例子说明:

建表:
create table test3(name varchar(100), primary key(name));
create table test4(name varchar(100), primary key(name)) collate utf8_bin;   给表test3插入数据:
insert into test3(name) values('abc');
insert into test3(name) values('ABD');
insert into test3(name) values('ZBC');给表test4插入数据:
insert into test4(name) values('abc');
insert into test4(name) values('ABD');
insert into test4(name) values('ZBC');查表:
select * from test3;
select * from test4;

从结果可以看到test3和test4返回的结果集中,记录的相对顺序是不同的,因为是全表扫描,返回的记录体现了主键顺序。由于test3表校验规则采用默认的utf8generalci,大小写不敏感,因此abc

关于mysql相关海量教程可以关注文末公众号回复【1】加助手微信索取。

本公众号免费提供csdn下载服务,海量IT学习资源如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。

扫码关注,精彩内容第一时间推给你

numeric比较大小 数据库_mysql大小写敏感与校对规则相关推荐

  1. mysql字符集与校对规则设置_MySQL 字符集与校对规则

    1.创建对象时的默认值MySQL 的设置可以分为两类 , 创建对象时的默认值 , 在服务器和客户端通信时的设置 . MySQL 服务器有默认的字符集和校对规则 , 每个数据库也有自己的默认值 . 每个 ...

  2. MySQL数据库——MySQL字符集和校对规则详解

    在讲解字符集和校对规则之前,我们先来简单了解一下字符.字符集和字符编码. 字符(Character)是计算机中字母.数字.符号的统称,一个字符可以是一个中文汉字.一个英文字母.一个阿拉伯数字.一个标点 ...

  3. mysql校对规则_MySQL中的校对规则

    详解MySQL中的校对规则 Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is ...

  4. mysql连接校对_mysql字符集和校对规则(Mysql校对集)

    字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到这个概念,mysql在这方便貌似很先进,大概介绍一下 简要说明 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于 ...

  5. numeric比较大小 数据库_SQL数据库中Numeric(10,2)是什么意思?

    Numeric(10,2) 指字段是数字型,长度为10 小数为两位的 简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR ...

  6. numeric比较大小 数据库_Liquibase 数据库版本管理工具:3. changeSet 变更集详解

    上篇文章中详细了介绍了一下changelog 文件的使用,本篇文章将详细说一下 changeSet 变更集 中的细节,以及通常的使用方式 1.变更集分类 changeSet 分为 6类: add cr ...

  7. numeric比较大小 数据库_数据库基础知识个人整理版-强烈推荐

    <数据库基础知识个人整理版-强烈推荐>由会员分享,可在线阅读,更多相关<数据库基础知识个人整理版-强烈推荐(20页珍藏版)>请在人人文库网上搜索. 1.数据库知识要点总结第一章 ...

  8. numeric比较大小 数据库_SQL中NUMERIC和DECIMAL的区别

    numeric 和 decimal 数据类型的默认最大精度值是 38.在 Transact-SQL 中,numeric 与 decimal 数据类型在功能上等效. decimal(numeric ) ...

  9. mysql 字符集和校对规则

    为什么80%的码农都做不了架构师?>>>    1,常规字符集及校对 假设我们有一个字母表使用了四个字母:'A'.'B'.'a'.'b'.我们为每个字母赋予一个数值:'A'=0,'B ...

最新文章

  1. bzoj 1064 图论
  2. 将Facebook整个托管在AWS上,这可行吗?
  3. kuangbin带我飞QAQ DLX之一脸懵逼
  4. 2、异步HTTP编程
  5. Linux系统【五】进程间通信-共享内存mmap
  6. hdu 1159(最长公共子序列)
  7. python图像数独_Python图像识别+KNN求解数独的实现
  8. 错误Unable to find manifest signing certificate in the certificat...
  9. 数据分析 超市条码_郑州科脉助力和美超市店面软件升级智赢
  10. cpu的用户态和内核态和内存的用户空间内核空间
  11. jQuery表格排序组件-tablesorter
  12. Nginx 注册为 windows服务
  13. 豆丁 道客巴巴 千图网 千库网 包图网 我图网 摄图网 巧办网 万方设计 中国知网 VIP会员一个月开通方法,十网通用
  14. Modelica技术特点及优势
  15. ckplay video.php,CKPLAYER播放器的教程-小白看
  16. 皇冠与锚-JS实现(拒绝赌博)
  17. 社会生活中的著名法则(一)
  18. Android WebView字体放大
  19. 九峰影业创始人_九峰百度百科
  20. 导带电子浓度和价带空穴浓度

热门文章

  1. 升级 ServeRADI-8i控制器,使用IBM 3650 9797 老服务器支持2T 硬盘
  2. 关闭Android/iPhone浏览器自动识别数字为电话号码
  3. java解析XML获取城市代码
  4. 陶哲轩实分析引理 11.1.4
  5. 职业经理十项管理技能必修课
  6. ReactNative学习笔记(一)环境搭建
  7. 《Unity3D-控制角色受伤的时候身体颜色变化的代码》
  8. Android Studio 使用Eclipse项目,仍保留项目结构,非导入转成gradle
  9. hdu 4348 To the moon (主席树)
  10. Java文件路径(getResource)