暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

MogDB - 兼容模式下导致数值类型发生隐式转换,SQL在生产上无法正常使用案例

原创 伊织鸟 云和恩墨 2022-05-13
1777

基于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

图片.png

处理思路

第一思路是是否发生了自动或者隐式转换,但是翻了整个手册,还是没有发现线索,由于应用还在测试,问题不是很急,当天下午就处理别的问题了,在下班的时候重新复盘一下故障现象(不得不说上下班真的是头脑风暴的好时间啊),对将这种字符当做数值型处理隐约有些熟悉,回家闷头翻书,果然发现,在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;

图片.png

总结

正好昨天杨明翰杨老师的恩墨直播培训提到了这里,杨老师的分析更加清晰,截图奉上:

图片.png

最后修改时间:2022-05-13 16:27:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论