ITPub博客

首页 > 数据库 > 数据库开发技术 > 无效数字问题:Oracle-MySQL-PG大不同

无效数字问题:Oracle-MySQL-PG大不同

原创 数据库开发技术 作者:xuexiaogang 时间:2023-02-09 14:34:59 0 删除 编辑

      有一天,一个开发找到我说。他的这个select 任意列 在查出数据的情况下 点击图1的这个按钮,数据逐步加载,然后就会出图2的报错。

                                                              图1


                                                                            图2

我第一感觉,任意列都这样,岂不是要走进科学了?而且神奇的是,不是一开始报错,是数据逐步加载的时候才报错。这一听的确很诡异。也就是这个描述,让我走了一段弯路。不过马上觉得思路不对。

我就想了一下,既然任意列都报错,那么就不是from之前的问题,而是where之后的问题。他的where也很简单:                time有between 范围,然后 and  tpye=65。type是一个列的名字。

我们检查了time列,数据类型是date类型。既然是date类型,数据在写入表的时候已经已经做了校验,就排除这个列的问题了。剩下的就是column=65。尽管看上去没有问题,但是这是唯一的可能性了。

当然最后我是解决了这个问题,我们来复现一下这个问题,同时对比一下其他数据库的情况。


                                                                            图3

表就是id a b 三个列,分别是id是int a和b都是字符串。

当字段是数值型的时候,=右边就是数值。

当字段是字符型的时候,=右边应该是字符,如果是数值的话,就会复现我们今天这个。

结论就是这个表的这个字段是字符串,也就是 上面提到的type=65,如何解决那么就是 type='65'就好了。

之所以会发生数据陆续加载中才会出来,是因为这一列有很多空值,空值不报错,但是遇到有数据的行就把报错了。


那么其他数据库上会如何呢?

我们来看看MySQL的


                                                                         图4

在图4中a是int型,无论怎么写都不出错。(这里我们先不考虑索引,仅仅考虑执行会不会出错)


                                                                         图5

在图5中b是字符型,无论怎么写都不出错。(这里我们先不考虑索引,仅仅考虑执行会不会出错)。

也就是说在Oracle中出错的在MySQL中没有问题。反过来说在MySQL中可以执行,但是到Oracle中就把报错了。

在那么在PG中会是如何?


                                                                    图6

图6在PG中和之前一样的建表。


                                                                                图7

看到图7,发现PG的检查和MySQL不一样,和Oracle是一样的。字符型的列,必须带引号。

以上是Oracle MySQL和PG在这个场景上的差异。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/637517/viewspace-2933911/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OracleACE/PostgreSQLACE/阿里云MVP/腾讯云TVP/墨天轮 MVP/TiDBMVA/数盟会华东区长老/OpenTenBase社区委和技术委委员/架构师技术同盟名人堂成员上海地区理事会成员/if社区联合发起人/《DBA实战手记》作者/公众号:四海内皆兄弟

注册时间:2013-07-01

  • 博文量
    422
  • 访问量
    953520