【MySQL】数据类型(一)

前言

MySQL也有数据类型,其中一些与C/C++/Java是一样的,但也有一些数据类型不同,更有新的独有的数据类型

在这里插入图片描述

一. tinyint等整型

MySQL将整型按照字节分成若干种
其中,每个类型的最大最小值因有无符号也有不同

在这里插入图片描述

无符号:create table t1(num tinyint unsigned);
有符号:create table t1(num tinyint);
不携带unsigned默认为有符号

插入数据时,如果超出该类型所能表示的最大最小值,MySQL会直接报错拦截

比如,我们建立一个只含一个tinyint类型的表
如果插入128和-129就会出现如下报错
在这里插入图片描述


在C/C++中,我们可以对char类型的变量赋值超过其表示范围的数据。编译器会进行截断。但这样就无法保证数据的正确性了。
所以在MySQL中,如果插入数据超出表示范围,那么就直接拦截,这样保证数据的合法性和正确性。这也是MySQL约束的一种表现

二. bit位字段类型

bit就是比特位的意思

bie(M) 位字段类型
M表示每个值的位数,范围从1到64,如果M被忽略,默认为1

如果创建表时,使用了比如65,超过bit范围的大小,会出现如下报错

mysql> create table bit_test(
    -> id int,
    -> online bit(65)
    -> );
ERROR 1439 (42000): Display width out of range for column 'online' (max = 64)

创建如下表

mysql> create table bit_test( 
    -> id int,
    -> online bit(10)
    -> );
Query OK, 0 rows affected (0.02 sec)

插入若干数据

mysql> insert into bit_test values (123,2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into bit_test values (123,3);
Query OK, 1 row affected (0.00 sec)

但是显示时,无法显示online

mysql> select * from bit_test;
+------+--------+
| id   | online |
+------+--------+
|  123 |       |
|  123 |       |
+------+--------+
2 rows in set (0.00 sec)

这是因为bit的显示是按照ASCII码表显示的,如果我们分别插入’a’和97,最后显示的结果都是字符’a’

mysql> insert into bit_test values (123,'a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into bit_test values (123,97);
Query OK, 1 row affected (0.01 sec)

mysql> select * from bit_test;
+------+--------+
| id   | online |
+------+--------+
|  123 |       |
|  123 |       |
|  123 |  a     |
|  123 |  a     |
+------+--------+
4 rows in set (0.00 sec)

我们可以在显示时将位字段转换成十六进制

mysql> select id,hex(online) from bit_test;
+------+-------------+
| id   | hex(online) |
+------+-------------+
|  123 | 2           |
|  123 | 3           |
|  123 | 61          |
|  123 | 61          |
+------+-------------+
4 rows in set (0.00 sec)

三. float浮点型

float (m,d) [unsigned]
m指定显示长度,d指定小数位数
占用空间位4字节
double与float类似,但是占用空间为8字节

float(4,2)表示数值最长为4个数字,小数点后必须两位
表示范围为-99.99~99.99
如果插入超过表示范围的数据,MySQL同样会进行拦截报错

mysql> create table float_test(
    -> id int,
    -> salary float(4,2)
    -> );

mysql> insert into float_test values (1,99.999);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1

mysql> insert into float_test values (1,100.0);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1

float类型,在插入时会进行四舍五入
比如:

mysql> insert into float_test values (1,23.456);
Query OK, 1 row affected (0.00 sec)

mysql> insert into float_test values (2,55.632);
Query OK, 1 row affected (0.00 sec)

mysql> select * from float_test;
+------+--------+
| id   | salary |
+------+--------+
|    1 |  23.46 |
|    2 |  55.63 |
+------+--------+
2 rows in set (0.00 sec)

插入23.456会五入为23.46;插入55.632会四舍为55.63
同时在插入数据时,也要避免四舍五入的影响,比如99.995,在五入后同样会超出范围


float的无符号不会像int整型那样有更大的范围,比如float(4,2) unsigned表示的范围为0.00~99.99
float因为其特殊的存储方式,在存储较大数值的数据时,容易出现误差

mysql> insert into float_test2 values (1,236523627345.2323523);
Query OK, 1 row affected (0.00 sec)

mysql> select * from float_test2;
+------+-----------------+
| id   | salary          |
+------+-----------------+
|    1 | 236523634688.00 |
+------+-----------------+
1 row in set (0.00 sec)

四. decimal浮点型

decimal(m,d) [unsigned]
m指定长度,d指定小数点后位数

decimal和float很相似
decimal(4,2)表示范围同样是-99.99~99.99
decimal(4,2) unsigned 可表示0~99.99

但float和decimal表示的精度不同

mysql> create table decimal_test(
    -> salary1 float(10,8),
    -> salary2 decimal(10,8)
    -> );

mysql> insert into decimal_test values (23.12345612,23.12345612);
Query OK, 1 row affected (0.00 sec)

mysql> select *from decimal_test;
+-------------+-------------+
| salary1     | salary2     |
+-------------+-------------+
| 23.12345695 | 23.12345612 |
+-------------+-------------+
1 row in set (0.01 sec)

float表示的精度大致为7位


decimal在存储较大数据时,也更为的精准

mysql> create table decimal_test2(
    -> salary1 float,
    -> salary decimal
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into decimal_test2 values (123456789.12345,123456789.12345);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from decimal_test2;
+-----------+-----------+
| salary1   | salary    |
+-----------+-----------+
| 123457000 | 123456789 |
+-----------+-----------+
1 row in set (0.00 sec)

decimal整数最大位数m为65,。支持小数最大位数d是30.如果d被省略,默认为0,如果m被省略了,默认为10
如果希望小数的精度高,或者数值较大,推荐使用decimal

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值