MYSQL的binary解决mysql数据大小写敏感问题
mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2;
+--------+-----------+
| COM1 | COM2 |
+--------+-----------+
| 0 | 1 |
+---------+-----------+
1 row in set (0.00 sec)
(仅仅有些而已!4.*以前)
因为有的MySQL特别是4.*以前的对于中文检索会有不准确的问题,可以在检索的时候加上binary。
建表:
create TABLE usertest (
id int(9) unsigned NOT NULL auto_increment,
username varchar(30) NOT NULL default '',
primary key (id)
)
插入数据:
insert into usertest (username) VALUES('美文');
insert into usertest (username) VALUES('美国项目');
insert into usertest (username) VALUES('李文');
insert into usertest (username) VALUES('老唐');
insert into usertest (username) VALUES('梦漂');
insert into usertest (username) VALUES('龙武');
insert into usertest (username) VALUES('夏');
例如:select * from usertest where username like '%夏%' ,结果七条记录都出来了,比较郁闷。
如果使用=而不是like的时候,select * from usertest where username = '夏' ,只出现一个结果。
insert into usertest (username) VALUES('文');
insert into usertest (username) VALUES('唐');
还是使用select * from usertest where username = '夏' ,结果还是出现3条记录,又郁闷了。解决办法如下:
1.在create的时候就使用binary
username varchar(30) BINARY NOT NULL default '', 如果表已经建好了,使用:
alter table usertest modify username varchar(32) binary; 来就该表的属性。
2.在query的时候加上binary
char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。
对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片。
对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度。
varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储
例外:Myisam引擎中使用ROW_FORMAT=FIXED时,每行使用相同的空间,造成浪费
char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
| addr | char(8) | YES | | NULL | |
| bn | varbinary(4) | YES | | NULL | |
| b | binary(8) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+----------------------+----------------------+
| concat("$",name,"$") | concat("$",addr,"$") |
+----------------------+----------------------+
| $asdf$ | $a$ |
| $asdf$ | $a$ |
| $a $ | $a$ |
| $a$ | $a$ |
| $t a$ | $a$ |
+----------------------+----------------------+
mysql> select * from zcy where name='a '; //由于name是varchar,比较时,'a '自动转换为'a'
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
mysql> select * from zcy where name='a';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
| 4 | a | a | ab | a |
+----+------+------+------+----------+
2 rows in set (0.00 sec)
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
| addr | char(8) | YES | | NULL | |
| bn | varbinary(4) | YES | | NULL | |
| b | binary(8) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
+--------------------+-------------------+
| concat("$",bn,"$") | concat("$",b,"$") |
+--------------------+-------------------+
| $ab a$ | NULL |
| $ab $ | $ab $ |
| $ab$ | $ab $ |
| $ab $ | $a $ |
| NULL | $a $ |
| NULL | $abcde $ |
| NULL | $abcd1234$ |
+--------------------+-------------------+
binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节
进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速
按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格
mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 5 | t a | a | NULL | a |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
varbinary保存变长的字符串,后面不会补\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.01 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 2 | asdf | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.00 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
1 row in set (0.00 sec)
MYSQL的binary解决mysql数据大小写敏感问题相关推荐
- mysql binary 查询_MYSQL的binary解决mysql数据大小写敏感问题 《转载》
BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写 如下: mysql> select binary 'ABCD'='ab ...
- mysql.sock作用-解决mysql.sock直接找不到了的问题-重新生成mysql.sock
= = = mysql.sock作用-解决mysql.sock直接找不到了的问题-重新生成mysql.sock mysql.sock作用 mysql的连接方式有两种: 1.通过TCP/IP的连接 ...
- mysql 问号_解决Mysql数据库插入数据出现问号(?)的解决办法
首先,我用的mysql数据库是5.7.12版本. 出现的问题: 1.插入数据显示错误,插入不成功,出现:Incorrect string value: '\xCD\xF5\xD5\xBC\xBE\xA ...
- 试题导入mysql乱码_解决Mysql导入乱码问题
解决Mysql导入乱码问题 方法一: 通过增加参数 –default-character-set = utf8 解决乱码问题 C:\Users\Administrator>mysql -uroo ...
- mysql 忘记root_解决MySQL忘记root密码
网上有很多关于忘记MySQL root密码的一些文章,里面都有写怎么去解决,但有时觉得写得太恶心,要么一字不漏的抄别人的,要么就说得不清不楚,好了,不吐槽了,以下是解决的整个过程. 首先我们要知道忘记 ...
- jsp解决mysql乱码_解决mysql+jsp出现乱码的问题
解决mysql+jsp出现乱码的问题 发布时间:2020-07-11 14:39:04 来源:亿速云 阅读:65 作者:清晨 这篇文章主要介绍解决mysql+jsp出现乱码的问题,文中介绍的非常详细, ...
- mysql hy000 1030_解决MySQL数据库SQL Error:1030, SQLState: HY000,Got error 28 from storage engine...
解决MySQL数据库SQL Error:1030, SQLState: HY000,Got error 28 from storage engine MySQL数据库报以下错误: ERROR 22-0 ...
- mysql iops_如何解决MySQL IOPS使用率高?
如何解决MySQL IOPS使用率高? 什么原因导致MySQL IOPS使用率高? 1.实例内存满足不了缓存数据或排序等需要,导致产生大量的物理 IO. 2.查询执行效率低,扫描过多数据行. 解决方法 ...
- mysql报1862_解决mySQL中1862(phpmyadmin)/1820(mysql)错误的方法
发现问题 之前一直运行的好好的,突然mysql就无法工作了.请求命令后报错误:error 1820 (hy000): you must set password before executing th ...
最新文章
- JS中字符串的相关操作
- 单防区扩展模块怎么用_Zens推出模块化可扩展无线充电器 可为6台设备同时供电...
- 从websphere6.1迁移到weblogic10.3的问题总结--转
- 技术有时间衰减因子.
- nullptr/nullptr_t
- 浅谈如何进行测试用例管理
- SpringBoot项目瘦身指南,大厂如何面试看出你的水平
- MAC 如何连接惠普打印机
- mysql复制表结构创建新表
- Redis原理浅析(一):Redis基本数据类型、事务以及排序
- CSS border-image(边框图片)
- 已解决ImportError: Pandas requires version ‘2.0.1‘ or newer of ‘xlrd‘ (version ‘1.2.0‘ currently instal
- 鲜枣课堂-文章分类目录(2019.7.28更新)
- 写论文自动生成参考文献的方法
- IT 民工避免猝死攻略 v1.0
- Python提取数据集中的数值变量/分类变量
- 利用高德地图实现定位功能
- 区块链的4种技术创新
- Nginx作为文件服务器提供下载-增加权限验证
- 基于svg开发绘制地铁图
热门文章
- 装饰器前奏2(2017年8月23日 11:50:39)(2017年8月29日 16:07:32)
- [翻译] VLDContextSheet
- java.util.Date和java.sql.Date之间的相互转换
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
- android学汇资料总整理
- PHP代码审计基础手册
- oracle表格颜色,如何在oracle中使用光标更新特定颜色
- [数据库] Oracle单表查询总数及百分比和数据横向纵向连接
- [Python学习] 专题六.局部变量、全局变量global、导入模块变量
- App设计灵感之十二组精美的健身App设计案例