博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MYSQL中的空格及大小写问题
阅读量:7211 次
发布时间:2019-06-29

本文共 2395 字,大约阅读时间需要 7 分钟。

hot3.png

项目去O,有同学反映oracle中的数据导入到mysql中不对了,背景是oracle中的数据存在空格敏感字段,比如oracle中123,空格123,123空格就是3个不同的数据,符合唯一约束。而mysql则认为存在相同的数据

另外对于oracle来说,大小写是敏感的,而mysql则不是,比如ABC,abc在oracle总是两条数据,而在mysql中默认是不符合唯一约束的

就以上两个问题我们分别来看一下,第一是大小写的问题

ORACLE中建表TTT,插入两条大小写的数据

INSERT INTO TTT VALUES (1,'name1');INSERT INTO TTT VALUES (2,'NAME1');
SELECT DISTINCT("name") from TTT;
结果是:

NAME1name1

同样的操作在mysql中直接结果如下:

INSERT INTO ttttt VALUES (1,'name1');INSERT INTO ttttt VALUES (2,'NAME1');SELECT DISTINCT(`name`) from ttttt;
返回的结果为:

name1
也就是是说mysql默认是大小写不敏感的,下面我来看下mysql中关于大小写敏感的成熟的解决方案:

ALTER TABLE `TTTTT`MODIFY COLUMN `name`  varchar(64) CHARACTER SET gbk COLLATE gbk_bin NULL DEFAULT NULL AFTER `id`;
再次在mysql中执行

SELECT DISTINCT(`name`) from ttttt;
name1NAME1
结果OK.所做的操作就是把字符集和排序规则改了一下

第二个问题就是mysql中的空格问题

先在oracle中执行

INSERT INTO TTT VALUES (1,'name1');INSERT INTO TTT VALUES (2,' name1');INSERT INTO TTT VALUES (3,'name1 ');INSERT INTO TTT VALUES (4,' name1 ');
SELECT DISTINCT("name") FROM TTT
所得的结果为:

name1 name1 name1 name1
也就是说oracle中name1,空格name1,空格name1空格,name1空格是4种不同的数据

分别对应下他们的长度:

SELECT "LENGTH"("name") FROM TTT
5667
接下来同样的操作在msyql中执行一下:

SELECT DISTINCT(`name`) from ttttt
执行结果如下:

name1 name1
也就是说mysql会把name1,name1空格合并,空格name1,空格name1空格合并,即在做distinct的时候其实mysql做了一次righttrim,即去掉右边的空格

那么在存储的时候mysql也做了这样的操作么?即只存righttrim后结果?

SELECT LENGTH(`name`) from ttttt
5667
从上面的结果来看,空格的长度是包含在其中的。

那么我们可以多做几个实验,distinct的时候mysql有做righttrim,那么查询的时候是否有类似操作呢?另外如果本身是唯一键的时候判断唯一的时候是否也会做righttrim呢?

首先是查询的时候

SELECT * from ttttt where `name` ='name1'
1	name13	name1
结果是mysql认为name1和name1空格是一样的

那么唯一约束的时候是否会做同样的操作呢?

ALTER TABLE `TTTTT`ADD UNIQUE INDEX `uniname` (`name`) ;
清空表再重新插入

INSERT INTO ttttt VALUES (1,'name1');INSERT INTO ttttt VALUES (2,' name1');INSERT INTO ttttt VALUES (3,'name1 ');INSERT INTO ttttt VALUES (4,' name1 ');
[SQL] INSERT INTO ttttt VALUES (1,'name1');受影响的行: 1时间: 0.074ms[SQL] INSERT INTO ttttt VALUES (2,' name1');受影响的行: 1时间: 0.071ms[SQL] INSERT INTO ttttt VALUES (3,'name1 ');[Err] 1062 - Duplicate entry 'name1 ' for key 'uniname'
从结果可以看出来,还是会认为后置空格是一样的。

那么这个问题在mysql怎么解决呢?解决方案是在字段前加一个binary关键字

SELECT DISTINCT(BINARY `name`) from ttttt
查询结果如下:

name1 name1name1  name1

也就是说mysql解决了空格的识别问题,会认为后置空格是不同的数据,这点也很容易理解,因为之前我们看各个字段的length的时候发现了其实各个数据的length还是不一样的

总结一下,mysql中的空格处理及大小写的处理和oralce还是有很大的差别的,对于mysql中的大小写问题我们可以设置排序规则,而mysql的后置空格问题我们可以使用binary关键字来强制检测空格

转载于:https://my.oschina.net/zimingforever/blog/103663

你可能感兴趣的文章
gulp同步执行任务
查看>>
各种变换滤波和噪声的类型和用途总结
查看>>
rocketmq生产者部署的机器注意事项
查看>>
exp函数
查看>>
MySql的一些用法
查看>>
DAMICON'S LIST OF OPEN SOFTWARE
查看>>
js-用于检测类数组对象的函数
查看>>
php 获取客户端的浏览器信息
查看>>
JavaScript------获取表单信息
查看>>
R语言︱文本挖掘——词云wordcloud2包
查看>>
Chapter 3 Phenomenon——18
查看>>
hibernate+spring整合增删改事务错误
查看>>
怎样理解阻塞与非阻塞、同步与异步的区别?
查看>>
C语言不定参数
查看>>
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab...
查看>>
在JavaScript中对HTML进行反转义
查看>>
面向服务的架构SOA
查看>>
WinForm 窗体初始位置篇
查看>>
PowerShell发送邮件(587)
查看>>
Chapter 3 Phenomenon——23
查看>>