mysql decimal类型主要场景_深入分析MySQL数据类型 DECIMAL

前言:

当我们需要存储小数,并且有精度要求,比如存储金额时,通常会考虑使用DECIMAL字段类型,可能大部分同学只是对DECIMAL类型略有了解,其中的细节还不甚清楚,本篇文章将从零开始,为你讲述DECIMAL字段类型的使用场景及方法。

1.DECIMAL类型简介

DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。NUMERIC与DECIMAL同义,如果字段类型定义为NUMERIC,则将自动转成DECIMAL。

对于声明语法DECIMAL(M,D),自变量的值范围如下:

M是最大位数(精度),范围是1到65。可不指定,默认值是10。

D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。

例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在salary列中的值的范围是从-999.99到999.99。

2.DECIMAL使用实战

下面我们将创建测试表来验证DECIMAL字段类型的使用:

# 创建具有DECIMAL字段的表 验证decimal默认是decimal(10,0)

mysql> create table decimal_tb (col1 decimal,col2 decimal(5,2));

Query OK, 0 rows affected (0.04 sec)

mysql> show create table decimal_tb\G

*************************** 1. row ***************************

Table: decimal_tb

Create Table: CREATE TABLE `decimal_tb` (

`col1` decimal(10,0) DEFAULT NULL,

`col2` decimal(5,2) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

# 插入数据测试

# 结论:超出存储范围会报错,小数位不足会自动补0,首位数字为0自动忽略,小数位超出会截断 并按四舍五入处理。

mysql> insert into decimal_tb (col1,col2) values (100,100);

Query OK, 1 row affected (0.05 sec)

mysql> insert into decimal_tb (col2) values (1.23);

Query OK, 1 row affected (0.01 sec)

mysql> insert into decimal_tb (col2) values (10.2);

Query OK, 1 row affected (0.01 sec)

mysql> insert into decimal_tb (col2) values (09.9);

Query OK, 1 row affected (0.01 sec)

mysql> select * from decimal_tb;

+------+--------+

| col1 | col2 |

+------+--------+

| 100 | 100.00 |

| NULL | 1.23 |

| NULL | 10.20 |

| NULL | 9.90 |

+------+--------+

4 rows in set (0.00 sec)

mysql> insert into decimal_tb (col2) values (9999);

ERROR 1264 (22003): Out of range value for column 'col2' at row 1

mysql> insert into decimal_tb (col2) values (12.233);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;

+-------+------+-------------------------------------------+

| Level | Code | Message |

+-------+------+-------------------------------------------+

| Note | 1265 | Data truncated for column 'col2' at row 1 |

+-------+------+-------------------------------------------+

1 row in set (0.00 sec)

mysql> insert into decimal_tb (col2) values (12.2300);

Query OK, 1 row affected (0.01 sec)

# 变量范围测试

# 结论:M范围是1到65,D范围是0到30,且D不大于M

mysql> alter table decimal_tb add column col3 decimal(6,6);

Query OK, 0 rows affected (0.12 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table decimal_tb add column col4 decimal(6,7);

ERROR 1427 (42000): For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'col4').

mysql> alter table decimal_tb add column col4 decimal(65,2);

Query OK, 0 rows affected (0.11 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table decimal_tb add column col4 decimal(66,2);

ERROR 1426 (42000): Too-big precision 66 specified for 'col4'. Maximum is 65.

mysql> alter table decimal_tb add column col5 decimal(60,30);

Query OK, 0 rows affected (0.13 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table decimal_tb add column col6 decimal(60,31);

ERROR 1425 (42000): Too big scale 31 specified for column 'col6'. Maximum is 30.

3.DECIMAL使用总结

上面的内容从实战出发,介绍了DECIMAL类型的使用方法及注意事项,你可能也知道float、double这些浮点数类型,这两个同样可以存储小数,但这里不过多介绍,只是提醒大家float、double类型无法确保精度,很容易产生误差,特别是在求和计算的时候,所有当存储小数,特别是涉及金额时推荐使用DECIMAL类型。这里总结下使用DECIMAL应该注意的事项:

DECIMAL(M,D)中,M范围是1到65,D范围是0到30。

M默认为10,D默认为0,D不大于M。

DECIMAL(5,2)可存储范围是从-999.99到999.99,超出存储范围会报错。

存储数值时,小数位不足会自动补0,首位数字为0自动忽略。

小数位超出会截断,产生告警,并按四舍五入处理。

使用DECIMAL字段时,建议M,D参数手动指定,并按需分配。

总结:

本文比较简单实用,通读下来,你大概会明白DECIMAL字段的使用场景及注意事项,其实对于常见的字段类型,我们只需要了解其使用场景及注意事项即可,当我们建表时,能够快速选出合适的字段类型才是我们的目的,比如当我们需要存储小数时,能够使用DECIMAL类型并且根据业务需要选择合适的精度,这样我们的工作将很容易开展下去。

以上就是深入分析MySQL数据类型 DECIMAL的详细内容,更多关于MySQL数据类型 DECIMAL的资料请关注我们其它相关文章!

本文标题: 深入分析MySQL数据类型 DECIMAL

本文地址: http://www.cppcns.com/shujuku/mysql/342092.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【初识mysql】 mssql 2000 Access DB2 oracle 【mysql安装】 1、官方下载mysql win32 msi 2、点击安装 3、配置 4、查看是否安装成功 通过cmd 输入netstat -a搜索3306端口是否处于listening状态 【mysql服务的启动与停止】 1、右击我的电脑-管理-服务与应用程序-服务-mysql 2、net stop mysql|net start mysqlmysql的配置文件以及数据位置】 1、安装目录下名为mysql.ini文件 2、默认数据位置 配置文件中字段为datadir 3、配置文件中简单的字段的理解 【mysql的登录与退出】 1、通过图形化界面 phpmyadmin mysqlGUI Navicat for MySQL 2、DOS登录或者自带的MySQL Command Line Client mysql -h IP或者域名 -u username -p -P port 回车 PWD 3、exit或者quit(CLI) 【密码的修改】 1、set password = password('密码'); set password for 用户名@域名或者地址 =password('密码'); 2、cmd下输入mysqladmin -uroot -p password 新密码 回车 旧密码 3、通过修改mysql数据库的user表 update mysql.user set password=password('新密码') where host='ip或者域名' and user='用户名' 【忘记密码的解决办法】 1、停止mysql服务 2、mysqld(mysqld-nt) --skip-grant-tables 3、重新打开窗口cmd 4、输入mysql -u root -p 回车 无需密码 5、通过上述密码修改方法3修改密码 6、flush privileges 7、exit 8、资源管理器kill进程mysqld 或者 mysql-nt 不要把mysql.exe 9、net start mysql 【简单的用户权限管理】 1、用户的创建 create user 用户名 identified by 密码 2、删除用户 drop user 用户名 3、用户重命名 rename user 原始名称 to 新名称 注释 : 用户名@localhost 只能本地登录 用户名@% 可以通过非本地登录 如果本地登录将%自动转换为localhost 【用户的权限】 1、初始用户只具有连接权限不具有其他权限,而且连接这个权限无法收回 只能通过删除用户 2、授权grant 收回权限revoke 3、授权语法 grant 权限 on 数据库.表 to 用户@域名或者IP identified by '密码' 4、收回权限 revoke 权限 on 数据库.表 from 用户@域名或者IP max_queries_per_hour 每个小时最大查询的数 0没有限制 max_updates_per_hour 每个小时最大更新数据的次数 0没有限制 max_user_connects 最大并发数 连接数 0没有限制 max_connects_per_hour 每个小时最大的并发数 0没有限制 【数据库的基本CLI】 1、show databases; 查看服务器中的所有数据库 2、select user(); 查看当前用户 3、select version(); 版本 4、show processlist; 在线详细信息 5、show warnings; 警告信息 6、use 数据库名称; 调用具体的数据库 7、show grants [for 用户名@域名或者IP]; 查看用户权限 8、select database(); 产看当前使用数据库 【数据库的创建和删除】 1、create database [if not exists] 数据库名称 2、drop database 数据库名称 【表的创建、修改和删除】 1、创建 create table [if not exists] 表名( 字段名称 类型(大小) 属性, 字段名称 类型(大小) 属性, 字段名称 类型(大小) 属性, ⋯⋯ )engine=innodb default charset=编码; create table [if not exists] 表名( 字段名称 类型(大小), 字段名称 类型(大小), 字段名称 类型(大小), ⋯⋯ 属性, 属性, ⋯⋯ )engine=innodb default charset=编码; 2、数据类型 日期类型:date Y-M-D 20110105(自动去除其中的非法符号!,*) time h:m:s 14:12:11 datetime date+time Y-M-D H:m:S timestamp:更新时日期值也会更新 timestamp default current_timestamp:只记录第一次插入的时间 数值类型: tinyint 0|1 smallint mediumint int[M] M默认11 人为设定系统也会根据自动分配空间(类似char和varchar) bigint float[(M,D)] 10的(M-D)次方->代表最大值 D->代表保留位数不够补0 //For float(M,D), double(M,D) or decimal(M,D), M must be >= D //只写M 0-24代表float精确度总的十位数超过6位用科学计数法,小数超出四舍五入,不够不补0 //float和double在desc中不会显示精确度 //select 中通过 float查询的前提是MD都有或者是double double //25-53代表double 但是不可以写精确度 >15位用科学计数法 字符串类型 char varchar text blob enum(v1,v2,v3⋯⋯65535) 插入的值是其中的一个 set(v1,v2,v3⋯⋯64) 插入的值是其中的0到多个 3、属性 1、自增属性 auto_increment 2、不为空not null | null 3、默认值default 4、主键primary key 5、列值的唯一 unqiue 6、索引 index|key 7、前导0 zerofill 属性可以写在末尾的主键 列值唯一 索引 4、查看表 desc 表名 show columns from 表名 show columns in 表名 5、修改表 alter table 表名 a) drop 字段 注意当表中字段为1个的时候不能删除 b) add 字段名 类型[大小] 属性,add 字段名 类型[大小] 属性⋯⋯ [after|first 字段] c) modify 字段名 类型[大小] 属性,modify 字段名 类型[大小] 属性⋯⋯ [after|first 字段] d) change 原始的字段名 新的字段名 字段名 类型[大小] 属性,modify 字段名 类型[大小] 属性⋯⋯ [after|first 字段] e) rename 新的表名 (方法二:rename table 旧的表名 to 新的表名) f) engine=存储引擎(type不建议使用) g) charset=字符编码 6、删除表格 drop table 表名 【表创建例题】 例题1:创建一个表用于存储用户上传的文件信息 (文件的原始名,大小,路径,文件名,类型,上传人,是否共享) 例题2:创建一个表用于存储用户注册信息 (用户名,密码,id,email,安全问题,安全问题答案) 例题3:创建一个表用户留言板信息 (给谁留言,是谁留的言,留言时间,留言内容) 【数据库和表相关信息的一些CLI】 1、show create database 数据库名 2、show create table 表名 3、show status; 4、show table status like ""; 5、show variables; 【数据库的备份与导入】 1、备份cmd->mysqldump -u root -p 数据库 [表名] > 文件名.sql->回车->密码 注意:cmd下运行mysqldump >覆盖 >>追加 2、还原:进入mysql下->source 路径 3、备份和还原可以进入配置文件所在数据目录下拷贝 【CURD操作】 1、表中记录的写入 insert into 表名[(字段1,字段2,字段3,⋯⋯)] values(值1,值2,值3,⋯⋯),(值1,值2,值3,⋯⋯) 2、insert into 表名 set 字段1=值1,字段2=值2,字段3=值3⋯⋯ 3、表中记录的删除 delete from 表名 where 条件 4、表中记录的更新 update 表名 set 字段1=值1,字段2=值2,字段3=值3⋯⋯ [where 条件] 5、表中记录的查询 select *|字段[,字段] [as 新字段名称] from 表名 [where 条件 group by 字段 having 附加条件 in() order by ASC|DESC limit开始,长度] 6、where 条件的理解 = | !=(<>) | between and | or | and | in | not 【mysql中的简单的数学函数】 1、统计函数 count()|max()|min()|avg()|sum() 2、mysql运算 php运算一致(除逻辑运算&& || !) 3、数学函数 pi()|round()|rand()|ceil()|floor|sin()|abs()|mod() 4、特殊的 like '' %->任意 regexp '' ->posix 【mysql中的字符串和时间】 concat(字符1,字符2...) 字符连接 instr(字符串,字符) 寻找字符所在字符串的位置 char ascii编码 转化为字符 ord 字符转化为ascii编码 substring(字符串,开始位置,长度); length(字符串) 字符串长度 substr(字符串,开始位置,长度); lpad 往左边填充 rpad 往右边填充 lower 转化为小写 upper 转化为大写 select left(字符串,长度);从左边取几位 select right(字符串, 长度);从右边取几位 select curdate(); 获取当前的日期 select curtime(); 获取当前的时间 select now();获取当前的时间跟日期

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值