Oracle中CHAR (n)和VARCHAR2(n)的区别

今天在做删除歌曲的时候,出现org.hibernate.ObjectNotFoundException: No row with the given identifier exists:[cn..entity.Song#1]的问题,不过查看表后,id的值是存在的。

经过一番查找,发现表中id字段的类型是CHAR(22),以前记得跟VARCHAR2有所区别,即CHAR 的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。

其中后台产生的SQL如下:
select song0_.ID as ID7_0_,song0_.TITLE as TITLE7_0_ from SONG song0_ where song0_.ID='1';
由上面可知,虽然你看到表中有id值为1,实际上它的值因为1+19个空格的长度,所以查找不到,如:

[url=http://hongfanshu.blogbus.com][img]http://dl.iteye.com/upload/attachment/349308/c765dc20-1a62-3080-9dcf-895f6a31381e.jpg[/img][/url]

[url=http://hongfanshu.blogbus.com][img]http://dl.iteye.com/upload/attachment/349316/73f1ff6b-140f-35c3-96ca-b1d67d201de2.jpg[/img][/url]

[url=http://hongfanshu.blogbus.com][img]http://dl.iteye.com/upload/attachment/349310/8d12a344-d49b-3e54-b0e8-13a64e4c9883.jpg[/img][/url]

[url=http://hongfanshu.blogbus.com][img]http://dl.iteye.com/upload/attachment/349306/f0229f4d-5c76-32c1-ab6f-2c3c7636c0be.jpg[/img][/url]

[url=http://hongfanshu.blogbus.com][img]http://dl.iteye.com/upload/attachment/349313/87f26ea2-75c1-3dbf-89ff-706534b9cd79.jpg[/img][/url]

select * from song t where t.id = '1' 可以查到数据
select * from song t where t.id = '1 '可以查到数据

select * from song t where t.title = 'lady gaga'可以查到数据
select * from song t where t.title = 'lady gaga '不可以查到数据

有空,欢迎到[url=http://hongfanshu.blogbus.com/]红番薯[/url]逛逛
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值