mysql 保留两位小数 查询_MySQL数据类型全解析

1 概述

本文主要介绍了MySQL的各种数据类型,版本为8.x.

MySQL的数据类型可以分为六类:数值类型,日期时间类型,字符串类型,二进制类型,JSON类型与空间数据类型.

2 数值类型

数值类型是最基本的类型,可以分为整数类型与浮点数类型.

2.1 整型

712d9aec0b127faa9aab8a1de2d07dfb.png

没写出的具体的精确值无符号的范围计算公式如下:

da5017ba37c677d80ee8df622c2b5e1b.png

有符号的计算公式如下:

7879b972f1381e2c8264cc3bf23175a4.png

所有整形如果允许NULL的话默认为NULL,不允许为NULL的需要手动设置默认值.

c597208ccd4bfcb1ffb9bac6ae0e4c1c.png

如果插入或修改的数据范围不符合会提示操作失败,如上图提示列c_mediumint的数据超出范围.

2.2 浮点型

可以用两种方式来表示小数,分别是浮点数类型与定点数类型.

浮点数用于不需要太精确的小数场合,类型包括FLOAT与DOUBLE,定点数类型就是DECIMAL.

9a21c7e5253f5c98ebbca58e95529ed3.png

下面是测试的待插入的数据:

86f5d8e099ba2ea0deb81b268cc780b0.png

插入之后再查询:

c86faa1df7542207f34752b4080d11b6.png

可以看到,float的精度最高为6位,后面的进行四舍五入,DOUBLE的最高精度为15位.

下面来说一下DECIMAL.

2.3 DECIMAL

DECIMAL也可用DEC来表示,用于计算精确的小数值,DECIMAL通常如下表示:

DECIMAL(M,D)

11fd55ce2d956f98b7aa1d2660986f68.png

如果要计算所占用的字节数,需要分为整数与小数两部分,分开计算再相加,每部分又按照9位数字去拆分,计算规则如下:

bf272aecb772189f849aed54290400b3.png

也就是说对于

DECIMAL(24,8)

整数部分24-8=16位,小数部分8位,小数部分的8位根据规则所占用的字节数为4个,整数部分按每9位进行拆分,16=9+7,9位的部分占4个字节,7位的部分按照规则也占4个字节,所以整数部分占8个字节,加上小数部分的4个字节,总共占12个字节.

至于NUMERIC,在MySQL中,NUMERIC被实现为DECIMAL:

f1efaa251ad73acdb9ccf1169eaa85c2.png

3 日期与时间类型

总共有五类:YEAR,TIME,DATE,DATETIME,TIMESTAMP.

3.1 日期

日期有两种类型:YEAR与DATE,YEAR表示年,DATE表示日期.

aee1ba5423ba53478d25bb33e8766dab.png

DATE中的年月日插入时可以不分隔或者用各种符号进行分隔,比如

! @ # $ % ^ & * ( ) - /  [ ] { } : ; ' " |  , . < > ?

792bfbb52179cf1ba7805da7f8296593.png

上图中的date都是合法的,插入之后MySQL都会统一用横杠代替:

05aaa56ea8f16edd9392af164799e059.png

YEAR的话MySQL其实允许两位数的YEAR,其中00-69表示2000-2069,70-99表示1970-1999.

其他插入方式的话可以用CURRENT_DATE,CURRENT_DATE(),CURDATE(),NOW(),CURTIME(),CURRENT_TIME,CURRENT_TIME():

99888d017f20ab7471e3445f2d84d8d9.png

f46b18e74d6e3329481e21a8e7d5a1df.png

3.2 时间

时间就一种类型:TIME.

TIME所占的字节数为3个字节,取值范围为:

[-838:59:59,838:59:59]

插入时时分秒可以不分隔或者必须以冒号分隔.

bc47e277e53a881d8caf5a18abf23de8.png

插入后统一变为冒号分隔:

08ba2cc3c2527172e9b8a8149604ec3f.png

可以使用CURRENT_TIME或CURRENT_TIME(),CURTIME()或NOW()插入:

c300456eb12b43bb59f16becd10d21ad.png

e9609c6329cdcc6a3b24fef2184dc83d.png

甚至也可以使用CURDATE(),不过此时插入的是零值:

346fac998e8671dff821c7d7432d5302.png

3.3 日期+时间

TIMESTAMP与DATETIME:

78ec9af4c885588b483d03533d104f43.png

DATETIME就是DATE与TIME的结合,先DATE再TIME,空格分隔.

TIMESTAMP表示时间戳,表示当前时间到1970年1月1日0时0分0秒经过的秒数,中的写法是年月日时分秒,比如

19700101080001

表示

1970年1月1日8时0分01秒

这里之所以使用080001是因为中国的时区.

19700101000000

会报错,范围不允许.

cbd1c1471ed4d78fc5cb593f12ed205a.png
19700101080000

也不行.

81fcdddb6634583c184bcdf3db245859.png

在插入时可以指定默认值,使用now()或CURRENT_TIMESTAMP:

e7bbf6707bab71c57209a5ede8735aa2.png

插入后DATETIME与TIMESTAMP存储的形式一致,横杠分隔日期,冒号分隔时间,时间与日期用空格隔开.

也可以使用CURTIME()或CURDATE()插入,对于CURTIME(),日期采用当前日期,对于CURDATE(),时间采用

00:00:00

b78784e16c0f4ce78391fc385d26350d.png

262f777dd1ab701247cb0a04608031f9.png

1183baf5c20468b877fe6f40c062c71e.png

4 字符串类型

4.1 CHAR/VARCHAR

0d8473d696a69309c2c9895848d6158a.png
图中的链接​learn.blog.csdn.net

无论是CHAR还是VARCHAR,超过了创建时指定的长度便插入失败:

31adc4c56c38f86c7dd8ec45337dd66c.png

1d358d2882cfe88a152d4fe9fac0c813.png

4.2 TEXT

TEXT是一种专用于存储长文本的变长数据类型,包括TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT:

22eebea309226f1209aa1e87484846a4.png

TEXT在插入时超过最大允许长度会插入失败.

4.3 ENUM

枚举类型,在创建表时enum的取值范围以列表的形式指定:

ENUM('value1','value2',...,'valuen')

ENUM占用1或2个字节,列表中最多能有65535个值,每个值末尾的空格都会被删除,列表中的每个值独有一个顺序排列的编号,MySQL会存入这个编号而不是对应的值.

0f54ebb2ad98b7859998d9b445cc6286.png

e94d56785bac0873d03ef0cc28f9ab96.png

等价于

2f36a10d9a5941445fadd4f1c8862ec9.png

即取值列表的编号从1开始.

4.4 SET

SET占用1或2或3或4或8个字节,取决于里面元素的数量,最大数量为64.SET可以是一个或多个元素的组合,值后面多余的空格会被删除,取多个元素时,不同元素用逗号隔开.

如:

db4aefe943d5982e7a1bb57969fed122.png

插入前:

c1b13bf6bf19c82fe9855c88837af29d.png

插入后:

afd5f2fbb7d033d7f34c0d280d62e830.png

5 二进制类型

5.1 BIT

BIT在创建时指定最大长度:

BIT(M)

M表示最大二进制数的位数,M取值1-64,默认1,插入数据时,如果数据在BIT允许的范围则插入成功,否则插入失败.

插入时需要加上b前缀,后面跟的字符串由0与1组成:

bf7977b568184d8b4f229ecb232cbe2f.png

查询之后就变成了十进制:

59111d4ae313dbc8e6d9be4aed0f3b5e.png

5.2 BLOB

BLOB是特殊的二进制数据类型,用来保存数据量很大的二进制数据,如图片等,BLOB包括TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOG,与TEXT类似:

0a72d760ef5a4a87a436c9155508c716.png

5.3 BINARY/VARBINARY

BINARY(M)/VARBINARY(M)中的M指的是字节长度,由于BINARY/VARBINARY存储的是二进制字符串,因此没有字符集的概念.

d32fa4f81a5cf97f3fcff594078f2d2b.png

下面的例子演示了插入时填充0x00:

a08cbf8c85c24ab7aa04bb091ded3b35.png

这里的BINARY为3个字节,插入了a,等价是插入了

a00

两个0填充后面两个字节,因此,前面两个比较的结果都为0.

比较时按照二进制值进行比较,这与CHAR/VARCHAR有很大不同.

9a876bfd4720ed62d03af05b0e745a65.png

CHAR/VARCHAR比较的是字符值,忽略后面的空格,因此比较结果为1,但是BINARY比较的是二进制值,'a'的二进制值化为十六进制为61,'a '的二进制值化为十六进制为6120,因此比较结果为0.

6 JSON类型

JSON存储的数据不能是NULL,只能是JSON格式的数据,否则会报错,

创建很简单,直接为JSON类型:

87a1fbacf1efad0613faa6b3dc5c4897.png

插入时可以使用一个JSON对象或JSON数组,数组用方括号,一个对象用花括号:

3876c7989eb27099c8128f41f1069bae.png

MySQL同时提供了一组操作JSON的函数,具体看这里.

这里演示了json_object函数,用来创建一个JSON对象:

2a07fd85556b9e872a59f2ca7480c694.png

插入后:

61db1dc1a7af68ad154c7b7dab8e9d79.png

7 空间数据类型

Spatial数据,又叫空间或几何数据,包含的数据类型有

  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON

其中GEOMETRY可用于存储任意几何类型.其他集合类型的空间数据类型如下:

  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION

其中GEOMETRYCOLLECTION可以存储任意类型的集合.

下面仅对POINT的使用作简单介绍.

0fddde0a5a2a3eeacf9450b2b3462eb8.png

插入数据使用st_geomfromtext()函数,参数是一个point(),里面的参数标识x,y坐标,空格分隔.

查询时直接

SELECT * FROM

会返回BLOB数据,需要使用st_astext(),参数为列名.

增加几行数据后,继续查询:

03fa674e78e226bb4f635376a2598773.png

142b06d6390af5b22b5cbecb1920ba93.png

使用了st_x()与st_y()两个函数,分别取得point的x,y坐标.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值