MySQL 查询不区分大小写的问题以及编码格式问题

查询不区分大小写

最近,在用SSH框架完成一个实践项目时,碰到了一个莫名其妙的Bug困扰了我好久,最后终于解决,记录如下。

问题:同学在测试系统的时候突然发现,数据库保存的账户本来应该是admin,结果该同学用Admin账户居然登录成功了……

……EXM???这样也行?好吧,我还是查找这个Bug发生的原因吧。然后就是各种排查程序的过程,找来找去也没发现什么问题。终于想到,不用hql,自己写sql语句在数据库里面直接查询试试,结果果然发现了问题所在:

select * from user where username = ‘admin‘ and password = ‘admin‘;
select * from user where username = ‘Admin‘ and password = ‘admin‘;

用上面的两条sql语句分表查询,出来的结果居然是一样的!……!!去搜索引擎搜索关键词:MySQL 查询 大小写,果然找到问题了!MySQL查询是不区分大小写的!这可真的是惊呆我了,虽然知道一般情况下,关键字是不区分大小写的,但是没想到连要查询的参数都是不区分大小写的!!再尝试下面的sql语句,果然还是一样的结果。

select * from user where username = ‘ADMIN‘ and password = ‘admin‘;

解决方案

Mysql默认的字符检索策略:utf8_general_ci,表示不区分大小写;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。(注意:在Mysql5.6.10版本中,不支持utf8_genral_cs!!!!)

创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性为utf8_general_cs或者utf8_bin。

-- 创建表:
CREATE TABLE testt(
id INT PRIMARY KEY,
name VARCHAR(32) NOT NULL
) ENGINE = INNODB COLLATE =utf8_bin;
-- 修改表结构的Collation属性
ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

直接修改sql语句,在要查询的字段前面加上binary关键字即可。

-- 在每一个条件前加上binary关键字
select * from user where binary username = ‘admin‘ and binary password = ‘admin‘;

-- 将参数以binary(‘‘)包围
select * from user where username like binary(‘admin‘) and password like binary(‘admin‘);

MySQL 编码格式

在mysql中存在着各种utf8编码格式,如下:

1)utf8_bin

2)utf8_general_ci

3)utf8_general_cs

utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。

utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

现在假设执行如下命令:

create table test_bin (

name varchar(32) not null primary key,

age int unsigned not null

) engine = InnoDB COLLATE=utf8_bin;

以上命令能够执行成功。

create table test_ci (

name varchar(32) not null primary key,

age int unsigned not null

) engine = InnoDB COLLATE=utf8_general_ci;

以上命令能够执行成功。

create table test_cs (

name varchar(32) not null primary key,

age int unsigned not null

) engine = InnoDB COLLATE=utf8_general_cs;

在5.6.10版本中,以上命令执行失败,不支持utf8_genral_cs。

insert into test_bin values(‘Alice‘, 18);

以上命令能够执行成功。

insert into test_bin values(‘alice‘, 18);

以上命令能够执行成功,因为utf8_bin是以十六进制方式存储数据,两条记录的主键不重复。

insert into test_ci values(‘Alice‘, 18);

以上命令能够执行成功。

insert into test_ci values(‘alily‘, 20);

以上命令执行失败,因为utf8_general_ci不区分大小写,两条记录的主键重复。

原文地址:https://www.cnblogs.com/ryanzheng/p/12309247.html

时间: 2024-10-11 03:21:17

MySQL 查询不区分大小写的问题以及编码格式问题的相关文章

MySQL查询时区分大小写

1.一种方法是可以设置表或行的collation,使其为binary或case sensitive.在MySQL中,对于Column Collate其约定的命名方法如下: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: case sensitive collation,区分大小写 *_ci: case insensitive collation,不区分大小写 ########### # Start binary colla

MySql查询不区分大小写解决方案(两种)

当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查询数据库. 发现的确是大小不敏感 . 通过查询资料发现需要设置collate(校对) . collate规则: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: case sensitive collation,区分大小写 *_

【MySQL】如何解决MySQL中查询不区分大小写的问题

mysql查询默认是不区分大小写的 如: select * from some_table where str=‘abc'; select * from some_table where str='ABC'; 得到的结果是一样的,如果我们需要进行区分的话可以按照如下方法来做: 第一种方法:要让mysql查询区分大小写,可以: select * from some_table where binary str='abc' select * from some_table where binary

转!!mysql 查询条件不区分大小写问题

做用户登录模块时,输入用户名(大/小写)和密码 ,mysql都能查出来.-- mysql查询不区分大小写. 转自 http://blog.csdn.net/qishuo_java/article/details/40118937 找出用户名id为'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'的用户的数据: select * from usertable where id = 'AAMkADExM2M5NjQ2LWUzYzctNDFkMC1h'; 结果出现两条记录.这就奇怪了

MySQL查询时强制区分大小写

平时很少会考虑数据存储需要明确字符串类型字段的大小写,MySQL默认的查询也不区分大小写.但作为用户信息,一旦用户名重复,又会浪费很多资源.再者,李逵.李鬼的多起来,侦辨起来很困难.要做到这一点,要么在建表时,明确大小写敏感(字段明确大小写敏感).如果通盘数据库所有字段都需要大小写敏感,不如在字符集设置时做好调整.不过,通常不建议这么做. 如果跟我一样,数据库已经在线上跑了,一个表上百万条数据,做字段类型变更有可能导致数据库宕机.那么好吧,在查询时,多加个单词好了! 例如,一般查询: SELEC

mysql 查询重复的(不区分大小写)数据的SQL优化

在mysql中查询不区分大小写重复的数据,往往会用到子查询,并在子查询中使用upper函数来将条件转化为大写.如: select * from staticcatalogue WHERE UPPER(Source) IN (SELECT UPPER(Source) FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1) ORDER BY upper(Source) DESC; 这条语句的执行效率是非常低

MySQL查询大小写是否敏感问题分析

mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的.  1. 什么是字符集和校验规则? 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则.任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则.要想列出一个字符集的校对规则,使用SHOW COLLATION语句. 校对规则一般有这些特征: 两个不同的字符集不能有相同的校对规则. 每个字符集有一个默认校对规则.例如,ut

MySQL查询语法

Select distinct productname from custom_Where product_price between 5 and 10Order by product_price desc ,product_nameLimit 3 offset 1: Limit 限定从1行开始选出3行,默认列是从0列开始的. 分号 或\g表示语句结束Help 或 \h 获取帮助quit或exit 退出distinct作用与后面所有列,不能部分使用查询order默认升序asc(ascend) 默

mysql查询中通配符的使用

mysql查询中通配符的使用     在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: “_” 匹配单个字符,”\_” 匹配”_” “%” 匹配任意个字符,包括零个字符 sql模式下的匹配,缺省是忽略大小写的,并且sql模式下的模糊匹配不能使用“=”或”!=”,而使用 like 或 not like. 例如: SELECT * FROM [user] WHERE u_name LIKE ‘%三