本文旨在分享迁移MySQL decimal字段时遇到“精度超出定义”问题时,如何理解MySQL和达梦对于decimal 等这一类数值数据类型。
1.了解达梦的数值数据类型定义
NUMERIC 类型
语法:NUMERIC[(精度 [, 标度])]
功能:NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是 1 至 38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去。例如:NUMERIC(4,1)定义了小数点前面 3 位和小数点后面 1 位,共 4 位的数字,范围在-999.9 到 999.9。所有 NUMERIC 数据类型,如果其值超过精度,DM 会返回一个出错信息,如果超过标度,则多余的位会被截断。
如果不指定精度和标度,缺省精度为 38,标度无限定。
2.实际案例分享:
我之前遇到过mysql deciamal(65,30)的,按自动转的话,达梦这边是dec(38,30) ,默认的转换,如果遇到整数位大于8的话,就存不下,会报:精度超出定义
mysql decimal(65,30):mysql的最大精度是65,65-30=35,说明mysql的整数部分是35位,小数点右边是30位小数。
dec(38,30):达梦最大精度只能到38,38-30=8, 说明达梦的整数部分是8位,小数点右边是30位小数。
如果为了满足整数位的位数,不引起“精度超出定义”的报错,对于mysql的decimal(65,30),达梦这边应该转成dec(38,3),就是35个整数位,3个小数位。
但实际也不能直接这个去设置,还是要看数据
因为直接这么转,小数位的数值也很重要的话,会失去数值的精度。
欢迎交流指导~
~~~~~~~~~~~~~~~分享完毕~~~~~~~~~~~~~~~~
更多内容,请访问达梦社区地址:https:eco.dameng.com