Oracle中ascii为0的陷阱

本文探讨了在Oracle数据库中插入ASCII值为0的字符时的现象,它并不等同于NULL,而是占用一个字节。通过DUMP函数可以查看ASCII码,而导出时可能被转换为NULL。建议避免插入ASCII 0字符,以简化数据检索。

墨墨导读:本文来自墨天轮读者投稿,ascii0是个空字符,如果将这个字符插入到oracle数据库中会是什么现象,是null吗?

数据技术嘉年华,十周年盛大开启,点我立即报名大会以“自研·智能·新基建——云和数据促创新 生态融合新十年” 为主题,相邀数据英雄,总结过往十年历程与成绩,展望未来十年趋势与目标!近60场演讲,大咖云集,李飞飞、苏光牛、林晓斌、黄东旭...,快来pick你喜欢的嘉宾主题吧!

一、概述

ascii0是个空字符,如果将这个字符插入到oracle数据库中会是什么现象,是null吗?


二、正式实验

创建一张测试表

create table test(id int, name varchar2(10), comm varchar2(30));

向这张测试表中插入以下数据

insert into test values(1, null, ‘null’); --直接插入null
insert into test values(2, ‘’, ‘empty string’); --插入空字符
insert into test values(3, ’ ', ‘blank space’); --插入空格
insert into test values(4, chr(0), ‘ascii0’); --插入ascii为0的字符

查测试表,可以看到第2列似乎都是空的

SQL> select * from test;


    ID NAME       COMM
------ ---------- ---------------
     1            null
     2            empty string
     3            blank space
     4            ascii0

查看第2列不为空值的行

SQL> select * from test where name is not null;


    ID NAME       COMM
------ ---------- ---------------
     3            blank space
     4            ascii0

加trim函数再查

SQL> select * from test where trim(name) is not null;


    ID NAME       COMM
------ ---------- ---------------
     4            ascii0

那么这个第4行第2列到底存的是什么呢,我们可以通过dump函数去查看

可以看到第4行的第2列跟第3行的第2列的空格一样,都是占了一个字节,而且他的ASCII码为0,那么我们可以通过下面的方式将第4行查出来

SQL> select * from test where name = chr(0);


    ID NAME       COMM
------ ---------- ---------------
     4            ascii0

我们将这张表通过plsql developer工具导出来,看是个什么情况

可以看到通过工具导出来的时候,第4行的第2列会直接转换成null

三、总结

  1. ascii为0插入到oracle中,并不是null,它占用一个字节,要查询出来只能用=chr(0)

  2. 尽量别插入ascii为0的字符到数据库中,可以用插入空字符串或者null代替,否则检索起来不方便

  3. 碰到实在是不知道这个字段到底存的是什么的时候,可以使用dump函数去查看它具体的ascii码


四、后记

这里分享下这个实验的由来。

因为要对比两个库的同一张表的数据差异性,表数据量不大,而且仅相差三条数据,肉眼看肯定不靠谱,很自然的就想到在一个库上建一张临时表,将另外一个库的这张表导过来,然后做个minus。但minus出来的结果竟然是第一张表的所有行,当时气氛一度很尴尬。


后面经过仔细分析,才发现原来是chr(0)在搞鬼,通过工具导出chr(0)的时候,它会自动转换成null,然而数据库中chr(0)并不是null,也就是说导出来再导进去的数据已经跟原始表的数据不一样了。

墨天轮原文链接:https://www.modb.pro/db/33720(复制到浏览器中打开或者点击“阅读原文”立即前往)

推荐阅读:144页!分享珍藏已久的数据库技术年刊

数据技术嘉年华,汇聚业内多种数据库最佳实践和顶级技术专家,只为总结 2020 ,与您尽享技术前沿,领先一步卓立变革潮头!

2020 数据技术嘉年华,现在加入,尽享超低票价优惠:

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!


云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值