mysql中varchar 大小写敏感问题

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

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

insert 和get 是否大小写敏感

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

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

例如,创建一个数据库:

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

使用的排序规则collation=utf8_general_ci

插入数据:

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

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

1mysql> select name, ASCII(name) from test; 2+------+-------------+ 3| name | ASCII(name) | 4+------+-------------+ 5| a | 97 | 6| A | 65 | 7+------+-------------+ 82 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
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid