MySQL也有数据类型,其中一些与C/C++/Java是一样的,但也有一些数据类型不同,更有新的独有的数据类型
MySQL将整型按照字节分成若干种
其中,每个类型的最大最小值因有无符号也有不同
无符号:
create table t1(num tinyint unsigned);
有符号:create table t1(num tinyint);
不携带unsigned默认为有符号
插入数据时,如果超出该类型所能表示的最大最小值,MySQL会直接报错拦截
比如,我们建立一个只含一个tinyint类型的表
如果插入128和-129就会出现如下报错
在C/C++中,我们可以对char类型的变量赋值超过其表示范围的数据。编译器会进行截断。但这样就无法保证数据的正确性了。
所以在MySQL中,如果插入数据超出表示范围,那么就直接拦截,这样保证数据的合法性和正确性
。这也是MySQL约束
的一种表现
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 (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(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
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。