無效數字問題:Oracle-MySQL-PG大不同

xuexiaogang發表於2023-02-09

      有一天,一個開發找到我說。他的這個select 任意列 在查出資料的情況下 點選圖1的這個按鈕,資料逐步載入,然後就會出圖2的報錯。

無效數字問題:Oracle-MySQL-PG大不同

                                                              圖1

無效數字問題:Oracle-MySQL-PG大不同

                                                                            圖2

我第一感覺,任意列都這樣,豈不是要走進科學了?而且神奇的是,不是一開始報錯,是資料逐步載入的時候才報錯。這一聽的確很詭異。也就是這個描述,讓我走了一段彎路。不過馬上覺得思路不對。

我就想了一下,既然任意列都報錯,那麼就不是from之前的問題,而是where之後的問題。他的where也很簡單:                time有between 範圍,然後 and  tpye=65。type是一個列的名字。

我們檢查了time列,資料型別是date型別。既然是date型別,資料在寫入表的時候已經已經做了校驗,就排除這個列的問題了。剩下的就是column=65。儘管看上去沒有問題,但是這是唯一的可能性了。

當然最後我是解決了這個問題,我們來複現一下這個問題,同時對比一下其他資料庫的情況。

無效數字問題:Oracle-MySQL-PG大不同

                                                                            圖3

表就是id a b 三個列,分別是id是int a和b都是字串。

當欄位是數值型的時候,=右邊就是數值。

當欄位是字元型的時候,=右邊應該是字元,如果是數值的話,就會復現我們今天這個。

結論就是這個表的這個欄位是字串,也就是 上面提到的type=65,如何解決那麼就是 type='65'就好了。

之所以會發生資料陸續載入中才會出來,是因為這一列有很多空值,空值不報錯,但是遇到有資料的行就把報錯了。


那麼其他資料庫上會如何呢?

我們來看看MySQL的

無效數字問題:Oracle-MySQL-PG大不同

                                                                         圖4

在圖4中a是int型,無論怎麼寫都不出錯。(這裡我們先不考慮索引,僅僅考慮執行會不會出錯)

無效數字問題:Oracle-MySQL-PG大不同

                                                                         圖5

在圖5中b是字元型,無論怎麼寫都不出錯。(這裡我們先不考慮索引,僅僅考慮執行會不會出錯)。

也就是說在Oracle中出錯的在MySQL中沒有問題。反過來說在MySQL中可以執行,但是到Oracle中就把報錯了。

在那麼在PG中會是如何?

無效數字問題:Oracle-MySQL-PG大不同

                                                                    圖6

圖6在PG中和之前一樣的建表。

無效數字問題:Oracle-MySQL-PG大不同

                                                                                圖7

看到圖7,發現PG的檢查和MySQL不一樣,和Oracle是一樣的。字元型的列,必須帶引號。

以上是Oracle MySQL和PG在這個場景上的差異。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2933911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章