项目去O,有同窗反映oracle中的数据导入到mysql中不对了,背景是oracle中的数据存在空格敏感字段,好比oracle中123,空格123,123空格就是3个不一样的数据,符合惟一约束。而mysql则认为存在相同的数据 mysql
另外对于oracle来讲,大小写是敏感的,而mysql则不是,好比ABC,abc在oracle老是两条数据,而在mysql中默认是不符合惟一约束的 sql
就以上两个问题咱们分别来看一下,第一是大小写的问题 shell
ORACLE中建表TTT,插入两条大小写的数据 oracle
INSERT INTO TTT VALUES (1,'name1'); INSERT INTO TTT VALUES (2,'NAME1');
SELECT DISTINCT("name") from TTT;结果是:
NAME1 name1
一样的操做在mysql中直接结果以下: code
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;
name1 NAME1结果OK.所作的操做就是把字符集和排序规则改了一下
第二个问题就是mysql中的空格问题 排序
先在oracle中执行 class
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种不一样的数据
分别对应下他们的长度: im
SELECT "LENGTH"("name") FROM TTT
5 6 6 7接下来一样的操做在msyql中执行一下:
SELECT DISTINCT(`name`) from ttttt执行结果以下:
name1 name1也就是说mysql会把name1,name1空格合并,空格name1,空格name1空格合并,即在作distinct的时候其实mysql作了一次righttrim,即去掉右边的空格
那么在存储的时候mysql也作了这样的操做么?即只存righttrim后结果? 总结
SELECT LENGTH(`name`) from ttttt
5 6 6 7从上面的结果来看,空格的长度是包含在其中的。
那么咱们能够多作几个实验,distinct的时候mysql有作righttrim,那么查询的时候是否有相似操做呢?另外若是自己是惟一键的时候判断惟一的时候是否也会作righttrim呢? 数据
首先是查询的时候
SELECT * from ttttt where `name` ='name1'
1 name1 3 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 name1 name1 name1
也就是说mysql解决了空格的识别问题,会认为后置空格是不一样的数据,这点也很容易理解,由于以前咱们看各个字段的length的时候发现了其实各个数据的length仍是不同的
总结一下,mysql中的空格处理及大小写的处理和oralce仍是有很大的差异的,对于mysql中的大小写问题咱们能够设置排序规则,而mysql的后置空格问题咱们可使用binary关键字来强制检测空格