相容模式下導致數值型別發生隱式轉換,SQL在生產上無法正常使用案例

openGaussbaby發表於2024-03-30

相容模式下導致數值型別發生隱式轉換,SQL 在生產上無法正常使用案例
本文出處:https://www.modb.pro/db/403148

基於 MogDB 版本 V2.0.1

問題現象
廠商研發描述 Insert SQL 在生產上無法執行,而測試環境中同版本的資料庫該 SQL 可以正常執行。

檢查 SQL 後,發現是很簡單的 insert into values 語句,故障點是將 ‘’ 值插入到了 numeric 資料型別的欄位中,提示“invalid input syntax for type numeric”,中斷 SQL 執行。一切都很正常。

但是之後跟研發溝通後,在研發的測試環境中, ‘’ 還就真的插入到了 numeric 中,而且語句也是簡單 insert into values,沒有做任何資料型別轉換。

場景復原
模擬現場如下:

create table t (
id int,
trade_time timestamp(0) without time zone,
position numeric(24,2));

insert into t(id,trade_time,position)
values(1,to_date('2022-05-13 11:05:00','YYYY-MM-DD HH24:MI:SS'),'');

ERROR: invalid input syntax for type numeric: ""
LINE 2: ...,to_date('2022-05-13 11:05:00','YYYY-MM-DD HH24:MI:SS'),'');
^
CONTEXT: referenced column: position

處理思路
第一思路是是否發生了自動或者隱式轉換,但是翻了整個手冊,還是沒有發現線索,由於應用還在測試,問題不是很急,當天下午就處理別的問題了,在下班的時候重新覆盤一下故障現象(不得不說上下班真的是頭腦風暴的好時間啊),對將這種字元當做數值型處理隱約有些熟悉,回家悶頭翻書,果然發現,在 Mysql 資料庫中,對於一個 numeric 型別欄位,當傳入一個字串時,會自動轉換為 0。

對應到 Mogdb 資料庫,Mogdb 資料庫本身支援多資料庫相容模式,相容模式包括 Oracle,MySQL,PostgreSQL。由於測試環境的 Mogdb 資料庫都是 PG 相容模式,形成了了思維慣性。一直以為故障時由於發生隱式轉換導致的。

在測試環境下,重新建立了一個 MySQL 相容庫,驗證了一下,確認’'可以被插入到 numeric 欄位中,並顯示為 0。

場景復現
create database db_mysql DBCOMPATIBILITY='B';

select datname,datcompatibility from pg_database;

\c db_mysql
create table t (
id int,
trade_time timestamp(0) without time zone,
position numeric(24,2));
insert into t(id,trade_time,position)
values(1,to_date('2022-05-13 11:05:00','YYYY-MM-DD HH24:MI:SS'),'');

select * from t;

總結
正好昨天楊明翰楊老師的恩墨直播培訓提到了這裡,楊老師的分析更加清晰,截圖奉上:

相關文章