MySQL--数据类型

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。同时,MySQL数据库管理系统也提供了数据类型决定表存储数据的类型

1、整型

整数类型是数据库中最基本的数据类型 ;有:tinyint、smallint、mediumint、int、bigint

MySQL支持类型类型的名称后面指定该类型的显示宽度,格式如下:

 数据类型(显示宽度)

数据类型参数是整数数据类型的名称,显示宽度参数是指定宽度的数值。显示宽度是指能够显示的最大数据的长度。 例如:int(4)指int类型的显示宽度为4。若不指定宽度情况下,每个整数类型都有默认的显示宽度;

在整数类型使用时,还可以搭配使用zerofill参数zerofill参数表示数字不足的显示空间由0来填补;使用时,MySQL会自动加上UNSIGNED属性(表示无符号数),其显示宽度比默认小1;

 mysql> use test;
 mysql> create table intdata1(
     a tingint zerofill,
     b smallint zerofill,
     c mediumint zerofill,
     d int zerofill,
     e bigint zerofill
     )
 mysql> desc intdata1;

总结:

  • 当整数值超过int数据类型支持的范围时,就可以采用bigint;
  • 在MySQL中,int数据类型是主要的整数数据类型
  • int(n)里的n是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度

整型的宽度仅为显示宽度,不是限制。因此建议整型无须指定宽度

 mysql> create table qf.test1(age int(10)); //在qf库下创建test1表格,设置数
 据类型
 ​
 mysql> insert into test1(age) values(1000);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into test1(age) values(2147483647);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into test1(age) values(2147483648); //超出范围,报错
 ERROR 1264 (22003): Out of range value for column 'age' at row 1
 ​
 mysql> select * from test1; //查询
 +------------+
 | age |
 +------------+
 | 100 |
 | 1000 |
 | 2147483647 |
 +------------+
 3 rows in set (0.00 sec)

2、浮点数类型

MySQL中使用浮点数类型定点数类型来表示小数。浮点数类型包括:精度浮点数(FLOAT型)双精度浮点数(DOUBLE型)定点数类型就是DECIMAL型

可看到: DECIMAL型的取值范围与DOUBLE相同。但是,DECIMAL的有效取值范围由M和D决定。而且,DECIMAL型的字节数是M+2。也就是说,定点数的存储空间是根据其精度决定的

MySQL中可以指定浮点数和定点数的宽度,其格式如下:

 数据类型(M,D)

M参数称为精度,是数据的总长度,小数点不占位置; D参数称为标度,是指小数点后的长度为D;

 float(5,2)     #一共5位,整数占3位.做了限制

这种方法虽然都适合于浮点数和定点数,但不是浮点数的标准用法。建议在定义浮点数时,如果不是实际情况需要,最好不要使用。如果使用了,可能会影响数据库的迁移。对定点数而言,DECIMAL(M,D)是定点数的标准格式,一般情况下可以选择这种数据类型。

如果不指定精度,浮点数和定点数有其默认的精度。FLOAT型和 DOUBLE型默认会保存实际精度,但这与操作系统和硬件的精度有关。DECIMAL型默认整数位为10,小数位为o,即默认为整数

 # 案例 宽度不算小数点
 mysql> create table test4(float_test float(5,2)); 
 mysql> desc test4;
 +------------+------------+------+-----+---------+-------+
 | Field | Type | Null | Key | Default | Extra |
 +------------+------------+------+-----+---------+-------+
 | float_test | float(5,2) | YES | | NULL | |
 +------------+------------+------+-----+---------+-------+
 1 row in set (0.00 sec)
 ​
 mysql> insert into test4(float_test) values(123.345534354);
 Query OK, 1 row affected (0.01 sec)
 ​
 mysql> insert into test4(float_test) values(34.39567);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into test4(float_test) values(678.99993);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into test4(float_test) values(6784.9);
 ERROR 1264 (22003): Out of range value for column 'float_test' at row 1
 ​
 mysql> select * from test4;
 +------------+
 | float_test |
 +------------+
 | 123.35 |
 | 34.40 |
 | 679.00 |
 +------------+
 4 rows in set (0.00 sec)

3、字符串类型

在数据库中存储字符串的数据类型。字符串类型包括CHAR、VARCHAR、BLOB、TEXT、ENUM和SET

3.1、char和varchar类型

CHAR类型和VARCHAR类型都是在创建表时指定了最大长度,其格式:

 字符串类型(M)        
 ​
 # char(10)指定长度为100          0~255
 # varchar(10)表示根据实际字符串长度占空间,最多10个   0~65535
  • char表示定长字符串长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充;因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间;
  • varchar表示可变长字符串长度是可变的;插入的数据是多长,就按照多长来存储;varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间

结合性能角度(char更快),节省磁盘空间角度(varchar更小)

 # 示例:
 mysql> create table t8(c char(5),v varchar(12));
 Query OK, 0 rows affected (0.42 sec)
 ​
 mysql> insert into t8 values('abcde','abcdef');
 Query OK, 1 row affected (0.38 sec)
 ​
 mysql> insert into t8 values('abc','abcdef'); #char可以少于规定长度。
 Query OK, 1 row affected (0.05 sec)
 ​
 mysql> insert into t8 values('abc777','abcdef7'); #char不能大于规定的长度。
 ERROR 1406 (22001): Data too long for column 'c' at row 1

总结:

  • 经常变化的字段用varchar
  • 知道固定长度的用char
  • 超过255字符的只能用varchar或者text
  • 能用varchar的地方不用text;text:文本格式

3.2、text类型

TEXT类型是一种特殊的字符串类型TEXT只能保存字符数据 ;类型包括有:TINYTEXT、TEXT、MEDIUMTEXT 和LONGTEXT;

类型允许的长度
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~16772150字节
LONGTEXT0~4294967295字节

3.3、enum类型

ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围就以列表的形式指定:

 属性名 enum(‘值1’,‘值2’,...,‘值 n’)
 ​
 # mysql> create table t10(sex enum('m','w'));
 # 只能从m,w两个里面2选其1
 # (enumeration)

有限制的时候用枚举

 # 示例:
 mysql> insert into t10(sex) values('m');
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into t10 values('w');
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> insert into t10 values('n');
 ERROR 1265 (01000): Data truncated for column 'sex' at row 1

4、日期类型

日期与时间类型是为了方便在数据库中存储日期和时间而设计的;类型:YEAR--表示年份、DATE--表示日期、TIME--表示时间、DATETIME和TIMESTAMP--表示日期和时间;

整数类型字节数取值范围零值
YEAR11901~21550000
DATE41000-01-01~9999-12-310000:00:00
TIME3-838:59:59~838:59:5900:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:590000-00-00 00:00:00
TIMESTAMP41970010180001~20380119111407000000000000

每种日期与时间类型都有一个有效范围。如果插入的值超过了这个范围,系统会报错,并将零值插入到数据库中。不同的日期与时间类型有不同的零值

4.1、YEAR类型

YEAR类型使用1个字节来表示年份。MySQL中以YYYY的形式显示YEAR类型的值。给YEAR类型的字段赋值的表示方法如下:

(1)使用4位字符串或数字来表示

范围从1901~2155。输入格式为‘YYYY'或YYYY。例如,输入‘2008’或者2008,可直接保存为2008。如果超过了范围,就会插入0000。

 mysql> create table year(a year);
 mysql> desc year;
 mysql> insert into year values(1998),('1907');
 mysql> select * from year;
 +---------+
 |       a |
 +---------+
 |    1998 |
 |    1907 |
 +---------+
 mysql> insert into year values(1899);
 Error...    # 超出范围会报错

(2) 使用⒉位字符串表示

例如,输入‘345454’,TIME类型会转换为34:54:54;输入值为数值345454,TIME类型也会转换为34:54:54。如果输入0和‘0’,那么TIME类型会转换为0000:00:00。

 mysql> insert into time values('345454'),('121212'),('0'),(0);
 mysql> select * from time;
 +----------+
 | a        |
 +----------+
 | 34:54:54 |
 | 12:12:12 |
 | 00:00:00 |
 | 00:00:00 |
 +----------+

(3) 使用2位数字表示

1-69转换为2001-2069,70-99转换为1970-1999。注意,2位数字与2位字符串是不一样的。因为,如果插入0,转换后的YEAR值不是2000,而是0000;

 mysql> insert into time values(24),(86),(0),(00);
 mysql> select * from time;
 +---------+
 |     a   |
 +---------+
 |    2024 |
 |    1986 |
 |       0 |
 |       0 |
 +---------+

4.2、TIME类型

TIME类型使用3个字节来表示时间。MySQL中以 HH:MM:SS 的形式显示TIME类型的值。其中,HH表示时;MM表示分,取值范围为0-59;SS表示秒,取值范围是0-59。TIME类型的范围可以从''-838:59:59'-‘838:59:59’。虽然,小时的范围是0~23。但是为了表示某种特殊需要的时间间隔,将TIME类型的范围扩大了。而且,还支持了负值

(1)‘D HH:MM:SS’格式的字符串表示

D表示天数;保存时,小时的值等于(D*24+HH) ;例如,输入‘2 11:30:50’,TIME类型会转换为59:30:50。当然,输入时可以不严格按照这个格式,也可以是“HH:MM:SS”,“HH:MM”、“D HH:MM”、“D HH”或者“SS”等形式。例如,输入‘30’,TIME类型会转换为00:00:30。

 mysql> create table time(a time);
 mysql> insert into time value('2 23:50:50'),('22:22:22'),('11:11'),('2 20:20'),('30');
 mysql> select * from time;
 +----------+
 | a        |
 +----------+
 | 71:50:50 |
 | 22:22:22 |
 | 11:11:00 |
 | 68:20:00 |
 | 00:00:30 |
 +----------+

(2) 'HHMMSS’格式的字符串或HHMMSS格式的数值表示。

 mysql> insert into time values('345454'),('121212'),('0'),(0);
 mysql> select * from time;
 +----------+
 | a        |
 +----------+
 | 34:54:54 |
 | 12:12:12 |
 | 00:00:00 |
 | 00:00:00 |
 +----------+

(3) 使用CURRENT_TIME或者NOW()输入当前系统时间

 mysql> insert into time values(current_time),(now());
 mysql> select * from time;
 +----------+
 | a        |
 +----------+
 | 11:24:10 |
 | 11:24:10 |
 +----------+

一个合法的 TIME值,如果超出TIME的范围,将被裁为范围最接近的端点; TIME类型专门用来存储时间数据,而且只占3个字节。如果只需要记录时间,选择TIME类型是最合适的;

TIME类型专门用来存储时间数据,而且只占3个字节。如果只需要记录时间,选择TIME类型是最合适的

4.3、DATE类型

DATE类型使用4个字节来表示日期 ;MySQL中是以 YYYY-MM-DD 的形式显示DATE类型的值。其中,YYYY表示年;MM表示月;DD表示日。DATE 类型的范围可以从‘1000-01-01’-'9999-12-31’。给DATE类型的字段赋值的表示方法如下:

(1)‘YYYY-MM-DD’或‘YYYYMMDD’格式的字符串表示

范围是‘1000-01-01 00:00:00'-'9999-12-31'; 例如,输入‘4008-2-8’,DATE类型将转换为4008-02-08;输入入‘20220308’,DATE类型将转换为2022-03-08。

MySQL中还支持一些不严格的语法格式,任何标点都可以用来做间隔符

 mysql> create table date(a date);
 mysql> insert into date values('1949-10-01'),('1951@3@4'),('1950#2#3'),('19520101');
 mysql> select * from date;
 +------------+
 | a          |
 +------------+
 | 1949-10-01 |
 | 1951-03-04 |
 | 1950-02-03 |
 | 1952-01-01 |
 +------------+

(2) ‘YY-MM-DD’或者‘YYMMDD’格式的字符串表示

‘YY'的取值,00-69转换为2000-2069,70-99转换为1970~1999; 例如,输入‘35-01-02’,DATE类型将转换为2035-01-02;输入‘800102’,DATE类型将转换为1980-01-02;

 mysql> insert into date values('20240723'),('990101'),('240101'),(0);
 mysql> select * from date;
 +------------+
 | a          |
 +------------+
 | 2024-07-23 |
 | 1999-01-01 |
 | 2024-01-01 |
 +------------+
 # 0报错:
 ERROR 1292 (22007): Incorrect date value: '0' for column 'a' at row 4

(3) 使用CURRENT_DATE或NOW()来输入当前系统日期

 mysql> insert into date values(current_date),(now());
 mysql> select * from date;
 +------------+
 | a          |
 +------------+
 | 2024-07-23 |
 | 2024-07-23 |
 +------------+

4.4、datetime类型

DATETIME类型使用8个字节来表示日期和时间。MySQL中以‘YYYY-MM-DDHH:MM:SS’的形式显示DATETIME类型的值;

定义方法示例:

 mysql> create table datetime(a datetime);
 mysql> insert into datetime values('1945-10-01 11:11:11'),('1950#2#3 11+11+11'),('19511001121212');
 mysql> select * from datetime;
 +---------------------+
 | a                   |
 +---------------------+
 | 1945-10-01 11:11:11 |
 | 1950-02-03 11:11:11 |
 | 1951-10-01 12:12:12 |
 +---------------------+
 ​
 mysql> insert into datetime values('52-10-01 11:11:11'),('53@1@1 11*11*11'),('790101121212');
 mysql> select * from datetime;
 +---------------------+
 | a                   |
 +---------------------+
 | 2052-10-01 11:11:11 |
 | 2053-01-01 11:11:11 |
 | 1979-01-01 12:12:12 |
 +---------------------+
 ​
 mysql> insert into datetime values(20080808080808),(090101080808),(790101080808);
 mysql> select * from datetime;
 +---------------------+
 | a                   |
 +---------------------+
 | 2008-08-08 08:08:08 |
 | 2009-01-01 08:08:08 |
 | 1979-01-01 08:08:08 |
 +---------------------+
 ​
 mysql> insert into datetime values(now());
 mysql> select * from datetime;
 +---------------------+
 | a                   |
 +---------------------+
 | 2024-07-23 15:17:02 |
 +---------------------+
 1 row in set (0.00 sec)

如何选择数据类型

1、整数和浮点数

不需要小数部分,就使用整数来保存数据;如果需要表示小数部分,就使用浮点数类型对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入;

浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择 DOUBLE 类型

2、浮点数和定点数

浮点数 FLOAT、DOUBLE相对于定点数 DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来存储。DECIMAL在MySOL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。在数据迁移中,foat(M.D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。进行数值比较时,最好使用DECIMAL类型

3、日期和时间

只需要记录年份,则使用YEAR 类型即可;如果只记录时间,则使用TIME类型

如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围,因此存储范围较大的日期最好使用DATETIME.

TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MVSOL会把TIMESTAMP 列设为当前的时间。因此当需要插入记录的同时插入当前时间时,使用TIMESTAMP是方便的。另外,TIMESTAMP在空间上比DATETIME更有效。

4、CHAR 与 VARCHAR

CHAR和VARCHAR的区别如下:

  • CHAR固定长度字符VARCHAR可变长度字符
  • CHAR自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格

CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点是浪费存储空间,所以对存储不大但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。

5、ENUM 和 SET

ENUM 只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。因此,在需要从多个值中选取一个时,可以使用ENUM。比如:性别字段适合定义为ENUM类型,每次只能从'男’或'女’中取一个值。 SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值在需要取多个值的时候,适合使用SET类型,比如要存储一个人的兴趣爱好,最好使用SET类型;

6、BLOB 和 TEXT

BLOB二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等,而TEXT只能存储纯文本文件

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李学不完

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值