123
返回列表 发新帖
楼主: shiguibao

[笔记] chr(0)的陷阱

[复制链接]
论坛徽章:
85
2008新春纪念徽章
日期:2008-02-13 12:43:03双黄蛋
日期:2011-06-17 11:07:502011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:24:022010年世界杯参赛球队:荷兰
日期:2010-08-28 00:09:112010年世界杯参赛球队:科特迪瓦
日期:2010-03-02 12:36:542010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:意大利
日期:2009-12-31 14:41:24
21#
 楼主| 发表于 2007-1-22 16:33 | 只看该作者
最初由 fanpig 发布
[B]我以前只在PLSQL DEVELOPER中使用过,没有得到正确的数据,就放弃了使用chr(0)的念头了。没想到可以用呀 [/B]

偶开始也是这样认为,结果换成sql*plus结果就完全不同了

使用道具 举报

回复
论坛徽章:
1
八级虎吧徽章
日期:2009-04-04 15:56:18
22#
发表于 2009-3-30 11:25 | 只看该作者
今天也遇到这个问题了。
看了这篇帖子,终于搞明白了。

我们的场景是:我们使用一个copy语句从一个表往另一表copy数据,源表上的一个字段A是有非空约束的,但奇怪的是copy到目标表的时候在这个字段A上就会报一个违反非空约束的错误。
后来找到了这条会报错的记录,在plslq developer里面看,这条记录的字段A是空的,我们都很奇怪,为何为空值的字段会能够加上非空约束。但到sql*plus里,就能看到字段A其实是有值的,只不过在它的具体值之前有个chr(0),即它的值为'chr(0)123'。
然后copy的时候,copy语句看到chr(0)之后,就将后面的值忽略掉了,导致目标表上该字段为空值,就报错了。

使用道具 举报

回复
论坛徽章:
9607
土豪章
日期:2013-12-31 14:11:39土豪章
日期:2013-12-31 14:11:39阿森纳
日期:2013-06-03 17:00:31阿森纳
日期:2013-10-11 09:27:58法拉利
日期:2013-12-27 15:20:30林肯
日期:2013-12-27 15:19:09法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30
23#
发表于 2009-3-30 12:02 | 只看该作者
nice ,学习了

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2006-03-20 10:36:212008新春纪念徽章
日期:2008-02-13 12:43:03ITPUB元老
日期:2008-11-28 13:45:41CTO参与奖
日期:2009-02-12 11:45:48生肖徽章2007版:虎
日期:2009-11-19 16:42:12ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
24#
发表于 2009-3-30 14:56 | 只看该作者
SQL> select * from v$version
  2  ;

BANNER
-------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Solaris: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


SQL> select 'aaaa'||chr(0)||'bbbb' from dual;

'AAAA'||CHR(0)||'B
------------------
aaaa bbbb

SQL> select 'aaa'||chr(13)||'bbb' from dual;

'AAA'||CHR(13)
--------------
bbb

sqlplus是可以显示的其他的工具是有问题,我好像以前也遇到过,我们遇到chr(13),chr(0)都用别的字符创替换,如果是比较字符串的话,呵呵

使用道具 举报

回复
论坛徽章:
10
八级虎吧徽章
日期:2008-12-28 14:00:47祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:兔
日期:2009-03-30 16:21:12生肖徽章2007版:牛
日期:2009-03-10 21:33:00生肖徽章2007版:龙
日期:2009-03-10 21:27:46生肖徽章2007版:龙
日期:2009-03-10 21:14:14生肖徽章2007版:龙
日期:2009-02-27 11:34:09授权会员
日期:2009-01-05 12:32:292009新春纪念徽章
日期:2009-01-04 14:52:282011新春纪念徽章
日期:2011-02-18 11:43:34
25#
发表于 2009-3-30 16:36 | 只看该作者
原帖由 y711 于 2009-3-30 11:25 发表
今天也遇到这个问题了。
看了这篇帖子,终于搞明白了。

我们的场景是:我们使用一个copy语句从一个表往另一表copy数据,源表上的一个字段A是有非空约束的,但奇怪的是copy到目标表的时候在这个字段A上就会报一个违反非空约束的错误。
后来找到了这条会报错的记录,在plslq developer里面看,这条记录的字段A是空的,我们都很奇怪,为何为空值的字段会能够加上非空约束。但到sql*plus里,就能看到字段A其实是有值的,只不过在它的具体值之前有个chr(0),即它的值为'chr(0)123'。
然后copy的时候,copy语句看到chr(0)之后,就将后面的值忽略掉了,导致目标表上该字段为空值,就报错了。


学习了

使用道具 举报

回复
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-12-03 01:03:272010世博会纪念徽章
日期:2010-09-14 17:24:312010新春纪念徽章
日期:2010-03-01 11:20:05生肖徽章2007版:马
日期:2009-11-13 10:55:15参与WIN7挑战赛纪念
日期:2009-11-06 10:44:24CTO参与奖
日期:2009-03-23 11:00:18生肖徽章2007版:马
日期:2009-02-08 17:20:54生肖徽章2007版:兔
日期:2008-12-01 13:33:59生肖徽章2007版:马
日期:2008-10-31 19:01:49奥运会纪念徽章:赛艇
日期:2008-10-24 13:25:17
26#
发表于 2009-3-30 18:09 | 只看该作者
学习!

使用道具 举报

回复
论坛徽章:
187
状元
日期:2016-04-28 14:18:17榜眼
日期:2016-04-28 14:18:17探花
日期:2016-04-28 14:18:17进士
日期:2016-04-28 14:18:17举人
日期:2016-04-28 14:18:17红宝石
日期:2012-04-13 17:18:06蓝锆石
日期:2012-02-20 12:20:11紫水晶
日期:2012-04-19 12:49:17祖母绿
日期:2012-02-27 22:10:14海蓝宝石
日期:2012-02-27 16:58:24
27#
发表于 2009-3-30 18:18 | 只看该作者
在TOAD中试了一下,同样有这样的问题。

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2009-3-30 19:30 | 只看该作者
Ascii码的0代表的是空。
Bin               Dec     Hex         缩写/字符                              解释
0000 0000    0          00            NUL (null)                                      空字符

[ 本帖最后由 zianed_cu 于 2009-3-30 19:35 编辑 ]

使用道具 举报

回复
论坛徽章:
0
29#
发表于 2017-4-20 11:47 | 只看该作者
myfriend2010 发表于 2007-1-18 13:30
SQL> Select 'aaaaa'||Chr(0)||'bbbbb' From dual;

'AAAAA'||CHR(0)||'BBBBB'

CHR(0)是结束符,'aaaaa'输出完毕就结束,就Cut了

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
30#
发表于 2017-4-25 17:34 | 只看该作者
rix_chan 发表于 2017-4-20 11:47
CHR(0)是结束符,'aaaaa'输出完毕就结束,就Cut了

你在回十年前的帖子……

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表