文档章节

mysql中varchar 大小写敏感问题

hgfgoodcreate
 hgfgoodcreate
发布于 04/11 15:24
字数 749
阅读 5
收藏 2

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

  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

© 著作权归作者所有

hgfgoodcreate
粉丝 15
博文 68
码字总数 145269
作品 0
海淀
程序员
私信 提问
mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别

mysql字段varchar区分大小写utf8bin、utf8general_ci编码区别: 在mysql中存在着各种utf8编码格式: utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。 utf8generaci不区分大小写...

木九天
2018/01/25
71
0
mysql大小写问题

MySQL的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 ;如下面 insert into t values('A'); insert into t values('a'); 当第二条执行的时候,如果是主键或者有唯...

foolbenben
2012/10/10
0
0
Mysql大小写敏感的问题

一、1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的: SELECT * FROM TABLE NAME WHERE name='clip'; SELECT * FROM TABLE NAME WHERE name='C......

zhwj407906450
2014/10/20
303
0
Mysql大小写敏感的问题

一、1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的: SELECT FROM TABLE NAME WHERE name='clip'; SELECT FROM TABLE NAME WHERE name='Clip'......

lw_tao
2015/03/02
137
0
解决MySQL查询不区分大小写

今天遇到一个情况, 查询数据时查询条件输入不管大小写,都能查到同样的数据。 比如: 输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件是大小写不敏感的。 因为程序使用了hibernate...

肥皂泡2
2011/10/26
11.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
6
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部