兼容模式下导致数值类型发生隐式转换,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;

总结

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

兼容模式下导致数值类型发生隐式转换,SQL在生产上无法正常使用案例的更多相关文章

  1. Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL

    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3 ...

  2. ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换

    js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...

  3. js基本类型,隐式转换,变量

    Js笔记(脚本语言 node.js) Js五种基本类型:数字,字符串,布尔,null,undefined: HTML结构,表现,行为分离. 变量命名规则: 以字母或[下划线开始($)]不推荐,后面跟上 ...

  4. java中类型的隐式转换

    byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

  5. c++中istream类型到bool类型的隐式转换

    事情的起因是见到了这种用法: while(cin>>m>>n&&m&&n) { } 现在分析一下,cin>>m>>n返回 ...

  6. DB性能-隐式转换

    1        什么是隐式转换 当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换.当然, 有些情况下有些类型是不可以发生转换的,比如说从DATE类型转换到N ...

  7. 数栈SQL优化案例:隐式转换

    MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...

  8. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  9. C++中的explicit关键字 - 抑制隐式转换(转)

    在C++程序中很少有人去使用 explicit 关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库 ...

  10. 一个 MySQL 隐式转换的坑,差点把服务器整崩溃了

    我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 本来是一个平静而美好的下午,其 ...

随机推荐

  1. 【Azure 应用程序见解】通过无代码方式在App Service中启用Application Insights后,如何修改在Application Insights中显示的App Service实例名呢?

    问题描述 在App Service中,可以非常容易的启动Application Insights服务.默认情况中,在Application Insights中查看信息时候,其中的对象名称默认为App ...

  2. C语言初学习——易错点合集(长篇)

    转义字符 例题一 int main() { char s[] = "012xy\08s34f4w2"; int i, n = 0; for (i = 0; s[i] != 0; i ...

  3. 测绘线性代数(四):数学期望、协方差、PCA

    数学期望 E(X) = ∑pixi,X为所有xi的集合,pi为xi对应的概率. 通常来说,xi都是离散的,除非像高斯分布,假设xi不是离散的,才用上式. 当xi是离散的,那么: E(X) = 1 / ...

  4. [好文推荐] 如何保护价值上千万的Node.js源代码? - 主要是ncc

    如何保护价值上千万的Node.js源代码? https://zhuanlan.zhihu.com/p/84386456 一个强大的JS混淆器. github.com/javascript-obfusc ...

  5. linux 服务器 执行命令挂起 nohup 改用 pm2

    nohup http-server -p 80 & nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! 重 ...

  6. koa-generator - koa 脚手架

    koa-generator - koa 脚手架 npm install -g koa-generator 创建 koa2 /tmp/foo && cd /tmp/foo 资料: 基于N ...

  7. Cordon、Drain、污点与容忍度、亲和性与反亲和性

    在Kubernetes(K8s)中,Cordon.Drain.污点与容忍度.亲和性与反亲和性都是与资源管理和调度相关的概念.下面是对这些概念的详细解释: Cordon(封锁.警戒): Cordon是一 ...

  8. python中往json中添加文件的方法

    一 前言: python中常用的一种方式,这里给大家列出来一下. 二 实例 比如,最简单的一个json文件 test_json = { "a": 1, "b": ...

  9. Python3解决UnicodeDecodeError: 'utf-8' codec can't decode byte..问题最快解决方案

    问题: 使用python3 作为socket通信的时候,出现了这个错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in posi ...

  10. Educational Codeforces Round 141:C. Yet Another Tournament

    一.来源:Problem - C - Codeforces 二.题面 三.思路 读题: 其他人的胜场由位次决定,对于第i位,其胜场为i-1 人数为\(5·10^5\),不是5(看错了) 每个人和自己比 ...