MySQL——第一章节(MySQL中的数据类型)
前言:
之前简单的介绍一下什么是数据库和基本的常用数据库命令和DDL(MySQL数据定义语言),下面将介绍关于数据库非常重要的知识,叫做【数据类型】,不仅是在MySQL中存在数据类型,在多门编程语言中都存在【数据类型】这个名词。
那什么是数据类型呢?下面将会一一介绍MySQL中常用的数据类型和数据类型的关键字、范围等。
MYSQL数据类型——坚持,才有可能
1、什么是数据类型
先来说一下地球上的各个国家的语言吧,在中国我们的语言叫做汉语,使用的字叫汉字,在美国有英语,俄罗斯有俄语,德国有德语,日本有日语,每个国家都有自己的语言和书写字体。
数据类型,就很相似各个国家的书写字体一样,每个类型都代表不同的书写方式(输入或者输出),但是也有很相似的同类型但是输入和输出有不一样的,比如美式英语和英式英语,简体汉字和繁体汉字,在一定角度看来,都是汉字,但是写出来就不一样。
在MySQL中支持多种数据类型,主要分为三类:
①数值型
②字符型
③日期/时间类型
1.1、数值型
数值型数据类型主要用于存储数值类的数据,不同的数据类型,提供不同的取值范围,需要存储的范围越大,所需要的存储空间就越大。
数值型:整数类型、浮点小数类型、定点小数类型
1.1.1、整数类型
| 类型名称 | 占用空间(字节) | 范围 | 说明
| TINYINT | 1 | 有符号型:-128~127、无符号型0 ~255 | 很小的整数
| SMALLINT | 2 | 有符号:32768~32767、无符号0 ~65535 | 小的整数
| MEDIUMINT | 3 | 有符号:-8388608~803388607、无符号0 ~16777215 | 中等大小的整数
| INT | 4 | - 2147483647~2147483647、无符号0 ~4294967295 | 普通的大小整数
| BIGINT | 8 | 这个很长 | 大的整数
从表中可以看出,占用字节最少的是TINYINT类型,最多的是BIGINT类型,我们可以根据占用的字节数求出数据类型的范围,有符号的类型的范围是-(2的n-1次方)-1 ~ (2的n-1次方),无符号的类型范围是0~(2的n次方-1),n代表的就是(字节值*8bit),因为1个字节需要8 bit的存储空间。
1.1.2、练习
#先创建一个数据库
mysql> CREATE DATABASE IF NOT EXISTS data_test;
#进入数据库
mysql> use data_test;
Database changed
#创建数据表
mysql> CREATE TABLE IF NOT EXISTS test(id INT(4),name varchar(5));
Query OK, 0 rows affected (1.38 sec)
表中的id字段的数据类型为INT(4),这里的 4 是表示该整型类型的数据宽度,指定能够显示的数值的个数,数值的位数小于指定宽度时会由空格填充,大于的时候,只要值没有大于该数据类型的取值范围,数值还是会依然插入,而且可以显示。
#这里插入一条id数值宽度大于规定的数据类型宽度
mysql> INSERT INTO test VALUES(10000,"KING");
Query OK, 1 row affected (0.11 sec)
#查看数据表数据(数值依然可以显示)
mysql> SELECT * FROM test;
+-------+------+
| id | name |
+-------+------+
| 10000 | KING |
+-------+------+
1 row in set (0.13 sec)
如果创建数据表时没有指定宽度,则系统会为每个类型指定默认的宽度值。
#创建新表,每个字段使用不同的整数类型,不设置宽度值
mysql> CREATE TABLE test_2(x TINYINT,y SMALLINT,z MEDIUMINT,m INT,n BIGINT);
Query OK, 0 rows affected (0.30 sec)
#查看表结构(DESC 命令用于查看数据表的结构)
mysql> DESC test_2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | tinyint(4) | YES | | NULL | |
| y | smallint(6) | YES | | NULL | |
| z | mediumint(9) | YES | | NULL | |
| m | int(11) | YES | | NULL | |
| n | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.03 sec)
在我们创建数据表时没有添加显示宽度时,系统添加了不同的宽度值,保证每个数据类型都可以取到取值范围内的所有值,整数类型的默认显示宽度与其有符号数的最小值的宽度相同(-号也占用一个宽度)。
注:显示宽度只用于显示数据插入的宽度和取值范围没有关系,也不能限制占用空间。
1.2、浮点型小数和定点型小数
生活中有整数,必然少不了小数,MySQL中用浮点数和定点数来表示小数。
浮点类型:
①FLOAT:单精度浮点类型
②DOUBLE:双精度浮点类型
定点类型:
DECIMAL(M,D):定点小数类型(压缩的“严格”定点数)
注:浮点数和定点数都可以用(M,N)表示,M表示总共的位数,D表示小数点后的位数。
1.2.1、练习
#创建新表,设置数据类型为浮点型和定点型,M=5,D=2
mysql> CREATE TABLE float_test(x float(5,2),y DOUBLE(5,2),z DECIMAL(5,2));
Query OK, 0 rows affected (0.30 sec)
#插入数据
mysql> INSERT INTO float_test VALUES(123.45,123.45,123.45);
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO float_test VALUES(123.456,123.456,123.456);
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO float_test VALUES(123.4,123.4,123.4);
Query OK, 1 row affected (0.14 sec)
#因为总位数是5位数,总位数超出后,系统报错,说插入x,y,z值的宽度超出设定的总位数
mysql> INSERT INTO float_test VALUES(123456.456,123456.456,123456.456);
1264 - Out of range value for column 'x' at row 1
mysql> INSERT INTO float_test VALUES(123.45,1234.456,123456.456);
1264 - Out of range value for column 'y' at row 1
mysql> INSERT INTO float_test VALUES(123.45,123.45,123456.456);
1264 - Out of range value for column 'z' at row 1
#查看正常插入的数据
mysql> SELECT * FROM float_test;
+--------+--------+--------+
| x | y | z |
+--------+--------+--------+
| 123.45 | 123.45 | 123.45 |
| 123.46 | 123.46 | 123.46 |
| 123.40 | 123.40 | 123.40 |
+--------+--------+--------+
3 rows in set (0.04 sec)
查看插入的数据可以发现,当超过设定的总位数的数在小数点后面,系统自动四舍五入后显示,当位数不足设定的总位数时,系统自动补0;
#创建新表,设置浮点类型和定点类型不加精度和标度,查看其默认值
mysql> CREATE TABLE test_float(x FLOAT,y DOUBLE,z DECIMAL);
Query OK, 0 rows affected (0.28 sec)
#查看表结构
mysql> DESC test_float;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| x | float | YES | | NULL | |
| y | double | YES | | NULL | |
| z | decimal(10,0) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
FLOAT和FOUBLE在不指定精度时,默认会采用实际精度(由计算机硬件和操作系统决定),DECIMAL不指定精度则默认为(10,0);
注:定点数以字符串的形式存储,在对精度要求较高的场景(如货币、科学数据等)使用DECIMAL的类型比较好
总结:在学习数据类型的时候难免枯燥无味,种类繁多,这还只是数据类型这个大模块其中的一点内容,关于学习MySQL的知识,我建议多练,练熟之后再继续往下进行,边学边练,数据类型还没写完,下次写日期和时间类型。谢谢观看!如果有什么建议欢迎私我。
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/p/16582272.html