2019独角兽企业重金招聘Python工程师标准>>>

首先解释一下问题,大小写敏感分为两个层面:

  1. varchar类型的值,insert 和 select 的结果是否是大小写敏感的?
  2. varchar类型的数据在比较的时候是否是大小写敏感的?

insert 和get 是否大小写敏感

通过查询mysql的配置参数,可以获得mysql本身对于varchar类型的字符存储是否是大小写敏感的:show Variables like '%lower_case_table_names',结果是

  1. 0表示大小写敏感;
  2. 1表示大小写不敏感;

例如,创建一个数据库:

CREATE TABLE `test` (`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

使用的排序规则collation=utf8_general_ci

插入数据:

insert into test values ('a');
insert into test values ('A');

查询数据在mysql中存储的ascii码:

mysql> select name, ASCII(name) from test;
+------+-------------+
| name | ASCII(name) |
+------+-------------+
| a    |          97 |
| A    |          65 |
+------+-------------+
2 rows in set (0.00 sec)

ASCII函数返回字符串最左边字符的ascii码。

存储在数据库中的字符ascii码是不同的,所以区分了大小写。

varchar类型的数据比较是否是大小写敏感

常见的进行数据比较的场景如:

  1. 使用了比较运算符,$>=, >, =, <, <=$
  2. 排序操作,group,order
  3. like操作

在数据比较时,

  1. 非字节类型数据,如CHAR, VARCHAR, TEXT类型,数据比较会使用数据的排序规则(collation配置);
  2. 字节类型数据,如BINARY, VARBINARY, BLOB类型,数据比较二进制的每个字节;
  3. 非字节类型数据和字节类型数据比较会按照字节类型数据比较规则进行。

数据库的默认编码一般是charset=utf8排序规则collation=utf8_general_ci,那么在比较的时候,非字节类型字符串就是大小写不敏感的。如果使用了类似LIKE 'a%',会将a%A%全部获取出来。

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

如果希望字符串比较时是大小写敏感的,那么需要修改排序规则。

日常使用情况总结

如果需要在查询中对非字符类型的数据进行比较操作,那么建议将database的排序规则改为utf8_bin,这样改database下的所有数据库均继承于database的collation支持排序。 如果仅仅是一个表需要支持,那么仅需要更新一个表的collection;甚至仅需要更改一个column的排序规则,也可以更新列的collection。

参考

  1. case-sensitivity

转载于:https://my.oschina.net/hgfdoing/blog/3035482

mysql中varchar 大小写敏感问题相关推荐

  1. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql

    java学习篇之---mysql中varchar类型总结 Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下 ...

  2. MySQL中的大小写敏感

    Mysql默认是不区分大小写的,如果业务需要用到区分大小写的判断,该怎么办呢? mysql> show variables like '%case%'; +------------------- ...

  3. mysql中int最大多少,int(11)最大長度是多少,MySQL中varchar最大長度是多少(轉)

    int(11)最大長度是多少,MySQL中varchar最大長度是多少? int(11)最大長度是多少? 在SQL語句中int代表你要創建字段的類型,int代表整型,11代表字段的長度. 這個11代表 ...

  4. MySQL中varchar最大长度是多少

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)  5.0版本以上,varchar(20),指的是20字符, ...

  5. mysql中varchar与oracle中varchar2区别

    一.字符与字节关系 一)"字节"的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位. (二)"字符"的定义 ...

  6. 【038】MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?

    ♣题目部分 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? ♣答案部分 (1).varchar与char的区别区别一,定长和变长char 表示定长,长度固定, ...

  7. mysql int11 最大值_int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)

    int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...

  8. mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

    mysql中varchar存储容量 1.varchar能存多少汉字.数字? 2.varchar的最大长度是多少呢? 3.字符.字节.位,之间的关系? 4.mysql字段类型存储需要多少字节? 5.va ...

  9. MySQL中varchar类型在5.0.3后的变化

    1.mysql varchar类型变化: mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 ...

最新文章

  1. python 数字循环
  2. sqlserver任务导出Excle
  3. 可视化神经网络的网络结构并保存
  4. electron 剪贴板 截图_用electron开发了一个屏幕截图工具
  5. python二十七:从最内部的循环直接跳出来
  6. 当Windows Vista提示“内存不足”……
  7. html或者jsp页面刷新问题
  8. IBM-X3650 6核处理器安装sql server 2005报错解决方法
  9. GIt——怎样克隆远程仓库到本地(敲详细)
  10. Ecipse快捷键的使用
  11. 管理(1)--- 管理者的基本要求是什么?
  12. 解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示The operation could not be completed. 的问题。...
  13. php调用jssdk转发_php一个文件搞定微信jssdk配置
  14. 关于开源软件的十个问题(下篇)
  15. 《当程序员的那些狗日日子》三
  16. android自动照相机2.0,Nano Camera
  17. 解决docker删除镜像时image is referenced in multiple repositories
  18. 强化学习(Reinforcement Learning)入门学习--01
  19. Veritas NetBackup8.1.1客户端安装
  20. ios启动时间优化--理论

热门文章

  1. C++中的向上类型转换和向下类型转换+四种强制类型转换
  2. 迅雷官方回应“被拖库”致密码泄露:恶意造谣
  3. ADSL上网常见错误提示
  4. 「小程序JAVA实战」小程序头像图片上传(下)(45)
  5. Oracle Dataguard 主备库的切换方法
  6. POJ-1274 The Perfect Stall---二分图模板
  7. Android 中文 API (90) —— WindowManager
  8. 鸟哥Linux私房菜基础学习篇 第二部分 Linux 文件、目录与磁盘格式_Linux文件权限与 目录配置_Linux文件与目录管理...
  9. SpringMVC + MyBatis整合 【转】
  10. 架构体系需要进一步研究探索的V2路线图