当前位置: 首页 > 编程笔记 >

详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义

秦安宁
2023-03-14
本文向大家介绍详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义,包括了详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义的使用技巧和注意事项,需要的朋友参考一下

同事问MySQL数据类型DECIMAL(N,M)中N和M分别表示什么含义,M不用说,显然是小数点后的小数位数,但这个N究竟是小数点之前的最大位数,还是加上小数部分后的最大位数?这个还真记不清了。于是乎,创建测试表验证了一番,结果如下:

测试表,seller_cost字段定义为decimal(14,2)

CREATE TABLE `test_decimal` (
 `id` int(11) NOT NULL,
 `seller_cost` decimal(14,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

起初,表中内容为空

mysql> select * from test_decimal;
Empty set (0.00 sec)

插入整数部分长度为14的数字,报超出列范围的错误

mysql> insert into test_decimal(id,seller_cost) values(1,12345678901234);
ERROR 1264 (22003): Out of range value for column 'seller_cost' at row 1

插入整数部分长度为12的数字,可以正确插入

mysql> insert into test_decimal(id,seller_cost) values(1,123456789012);
Query OK, 1 row affected (0.00 sec)

查询表,发现插入的整数值末尾被MySQL补了两位小数“.00”

mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost   |
+----+-----------------+
| 1 | 123456789012.00 |
+----+-----------------+
1 row in set (0.00 sec)

继续插入整数部分12位,小数部分5位的数字,可以成功插入,但是有警告,警告表明小数部分发生了截断,被截取成了两位小数

mysql> insert into test_decimal(id,seller_cost) values(1,123456789012.12345);
Query OK, 1 row affected, 1 warning (0.00 sec)
 
mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                     |
+-------+------+--------------------------------------------------+
| Note | 1265 | Data truncated for column 'seller_cost' at row 1 |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost   |
+----+-----------------+
| 1 | 123456789012.00 |
| 1 | 123456789012.12 |
+----+-----------------+
2 rows in set (0.00 sec)

缩小整数部分的长度为2,小数部分的长度继续保持为5,可以成功插入,但小数部分被截断为两位。

mysql> insert into test_decimal(id,seller_cost) values(1,12.12345);
Query OK, 1 row affected, 1 warning (0.00 sec)
 
mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                     |
+-------+------+--------------------------------------------------+
| Note | 1265 | Data truncated for column 'seller_cost' at row 1 |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost   |
+----+-----------------+
| 1 | 123456789012.00 |
| 1 | 123456789012.12 |
| 1 |      12.12 |
+----+-----------------+
3 rows in set (0.00 sec)

继续插入一个小数部分不足两位的数字,可正确插入,且小数部分被自动补全到两位。

mysql> insert into test_decimal(id,seller_cost) values(1,12.1);
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost   |
+----+-----------------+
| 1 | 123456789012.00 |
| 1 | 123456789012.12 |
| 1 |      12.12 |
| 1 |      12.10 |
+----+-----------------+
4 rows in set (0.00 sec)

综上所述,DECIMAL(N,M)中M值的是小数部分的位数,若插入的值未指定小数部分或者小数部分不足M位则会自动补到M位小数,若插入的值小数部分超过了M为则会发生截断,截取前M位小数。N值得是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过N-M位,否则不能成功插入,会报超出范围的错误。

总结

以上就是本文关于详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:MySQL中or语句用法示例、简述Redis和MySQL的区别等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

 类似资料:
  • 描述 (Description) 占有量词[X{n,m}+]匹配存在至少n但不超过m次的X. 例子 (Example) 以下示例显示了possesive量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PossesiveQuantifi

  • 描述 (Description) 不情愿量词[X{n,m}?]匹配存在至少n但不多于m次的X. 例子 (Example) 以下示例显示了不情愿量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReluctantQuantifierDem

  • 描述 (Description) 贪心量词[X{n,m}]匹配至少为n但不超过m次的X. 例子 (Example) 以下示例显示了贪婪量词的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GreedyQuantifierDemo {

  • 我明天有一个计算机科学期中考试,我需要帮助确定一个特定递归函数的复杂性,如下所示,这比我已经研究过的东西要复杂得多:它有两个变量 T(n)=3 mT(n-m) 在m为常数的简单情况下,可以通过编写解包关系轻松获得公式;然而,在这种情况下,拆包并不会使生活变得更容易,如下所示(假设t(0)=c): T(n)=3 mT(n-m) T(n-1)=3 mT(n-m-1) T(n-2)=3 mT(n-m-2

  • 我被问到一个问题,我们正在寻找重复的社会安全号码,就像ssn中的数组a和数组B一样。我的第一个想法是迭代每个数组,在一个hashmap,存储每个ssn的计数。当然,所有计数超过1的键都是重复的。我的理解是,这将是一个O(n+m)操作,其中m和n是每个数组中的元素数。有人告诉我,就时间复杂度而言,这是“非常低效的”,时间复杂度实际上是O(n*m)。这怎么正确?

  • 本文向大家介绍正则表达式{n,m}量词(至少n次,最多m次),包括了正则表达式{n,m}量词(至少n次,最多m次)的使用技巧和注意事项,需要的朋友参考一下 正则表达式{n,m}量词: {n,m}量词可以重复前面匹配的字符n-m次,至少n次,最多m次。 语法结构: 构造函数方式: 对象直接量方式: 浏览器支持: IE浏览器支持此元字符。 火狐浏览器支持此元字符。 谷歌浏览器支持此元字符。 实例代码:

  • 我在一个项目中有一个奇怪的需求。加入两个n: m属性表(我将用虚拟属性呈现行为)。 第一表(idPlace、idAddress、idSchool、wage)加入1:m 当然,我有表地方,地址,学校,企业与他们各自的ID,获取,集合和属性在实体类中实现。 代码: 位置 地址 学校 第一桌 FirstTablePK 上面提到的表和联接工作得很好。现在我想把第一个表和第二个表连接起来。 企业号 现在,对

  • 7.4. 使用{n,m} 语法 7.4.1. 校验十位数和个位数 在 前面的章节,你处理了相同字符可以重复三次的情况,在正则表达式中有另外一个方式来表达这种情况,并且使代码的可读性更好。首先来看我们在前面的例子中使用的方法。 例 7.5. 老方法:每一个字符都是可选的 >>> import re >>> pattern = '^M?M?M?$' >>> re.search(pattern, 'M