前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >oracle字符串排序问题记录

oracle字符串排序问题记录

作者头像
SmileNicky
发布2019-01-17 16:12:30
9360
发布2019-01-17 16:12:30
举报
文章被收录于专栏:Nicky's blogNicky's blog

本博客记录一下一次踩坑记录,过程是这样的,在跟一个bug,涉及到一张中间表,然后这张中间表的主键是自增的,不过因为对接其它系统,出现了主键唯一性冲突,所以我就只好改数据了,思路是想查最大值,然后修改数据。原本认为既然是一张中间表,那我不改关联表就好,我改中间表的主键应该不会影响系统。不料还是出现了数据问题了。

查询这张中间表的主键的最大值时,我并没有注意到是varchar类型的,以为是number类型的,数据库采用Oracle。PS:Oracle并没有int类型,这点和MySQL不一样。

查询到间表的id最大的值,很自然的,就敲条sql select max(id) from Table a; 这条sql就得到最大值,看起来很正常,不过我并没有注意到这个id是varchar类型,所以开发过程,需要仔细一点,虽然我们都知道这个道理,不过在项目很赶,或者状态不好的情况,还是很多人不仔细,所以我还是记录一下,仅仅是作为个人的笔记记录一下而已,然后仅仅是参考,希望能给别人一些启发。

我查出的最大值是9999,不过偶然发现,竟然有个10000+的数值,这样我就纳闷了。所以,这里说一下,这个id是字符串类型的,字符串类型的排序和number类型的排序是不一样的,Oracle字符串比较大小是根据ASCII来的,字符串排序是先比较第一个字符,eg:这里列举"9"和"10"的列子,这里的"9"和"10"都是字符串类型的,比较过程是这样的,先从第一个字符比较,'9’比’1’大,所以,"9"排在前面,"10"排在后面。PS:字符串比较就是这样根据ASCII来,先比较第一个字符,如果相等,在比较第二个字符,以此类推…

所以SQL:select max(id) from Table a;就会出现"9"比"10"大的情况,这里的id是字符串类型。 要得出正确的情况:在Oracle里就要用SQL:

代码语言:javascript
复制
	select max(to_number(id)) from Table a;

然后我在改数据的过程出现了问题,然后幸好有公司导师相助,得到了一条数据库回滚的SQL,所以还是学到了。下面给出SQL,希望可以帮助学习的人

代码语言:javascript
复制
【表数据恢复回N分钟之前】

alter table 表名 enable row movement; 
flashback table 表名 to timestamp systimestamp - interval 'N' minute; 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档