MySQL的数据类型和运算符
mysql菜鸟教程字符串型⼀、数据类型介绍
(1)数据表由多个字段组成,每⼀个字段都有制定⾃⼰的数据类型,指定了数据类型后,也就决定了向字段插⼊数据的内容;
(2)不同的数据类型也决定了MySQL在存储数据的时候使⽤的⽅式,以及在使⽤数据的时候选择什么运算符进⾏运算;
(3)数值数据类型:TINYINT 、SMALLINT、MEDIUMINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL
(4)⽇期\时间数据类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP
(5)字符串数据类型:CHAR 、VARCHAR、BINARY、 VARBINARY、BLOB、TEXT、ENUM、SET
⼆、数值类数据类型
(1)数值类数据类型主要⽤来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越⼤,需要的存储空间也越⼤;
(2)数值型分为:整数类型、浮点数类型、定点数类型;
1、整数类型(整数类型的属性字段可以添加AUTO_INCREMENT ⾃增约束条件)
类型名称说明存储需求有符号取值范围⽆符号取值范围TINYINT很⼩的整数1个字节-128 ~ 1270 ~ 255
SMALLINT⼩的整数2个字节-32768 ~ 327670 ~ 65535 MEDIUMINT中等⼤⼩的整数3个字节-8388608 ~ 83886070 ~ 16777215 INT普通⼤⼩的整数4个字节-2147483648 ~ 21474836470 ~ 4294967295 BIGINT⼤整数8个字节-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615 2、浮点数类型和定点数类型:
(1)MySQL中使⽤浮点数和定点数来表⽰⼩数,浮点数有两种类型:单精度浮点数(FLOAT),双精度浮点数(DOUBLE)定点数只有DECIMAL;
(2)浮点数和定点数都可以⽤(M,D)来表⽰,其中M 是京都,表⽰总共的位置(不算点号),D是标度,表⽰⼩数的位数;
(3)DECIMAL 实际上是以字符串形式存放的,在对精度要求⽐较⾼的时候(如 货币、科学数据等)使⽤DECIMAL类型⽐较好;
(4)浮点数相对于定点数的优点是在长度⼀定的情况下,浮点数能够表⽰更⼤的数据范围(取值范围更⼤),它的缺点是会引起精度问题。
类型名称说明存储
需求
有符号取值范围⽆符号取值范围
FLOAT 单精
度浮
点数
4个
字节
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-
38,3.402 823 466 351 E+38)
0,(1.175 494 351 E-38,3.402
823 466 E+38)
DOUBLE 双精
度浮
点数
8个
字节
(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-
308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7
layer汉语意思E+308)
0,(2.225 073 858 507 201 4 E-
308,1.797 693 134 862 315 7
E+308)
DECIMAL 定点
在线表单网站数
M
+2
个字
节
不固定 依赖于M和D的值不固定 依赖于M和D的值
三、⽇期时间类型
(1)MySQL有多重表⽰⽇期的数据类型,⽐如:当只记录年份信息时,可以使⽤YEAR类型,⽽没有
必要使⽤DATE类型;(2)每⼀个类型都有合法的取值范围,当数据是不合法的值时,系统将“零”值插⼊到数据库中
类型名称⽇期格式⽇期范围存储需求
YEAR YYYY1901 ~ 21551字节
TIME HH:MM:SS-838:59:59 ~ 838:59:593字节
DATE YYYY -MM -DD1000-01-01 ~ 9999-12-313字节
DATETIME YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:598字节
TIMESTAMPUTC YYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:074字节1、YEAR:
(1)格式:以4位字符串格式表⽰的YEAR 范围为‘1901’ ~ ‘2155’
(2)格式:以4位数字格式表⽰的YEAR,范围为1901 ~ 2155
(3)格式:以2位数字格式表⽰的YEAR 范围为‘00’ ~ ‘99’ 其中,‘00’~‘69’被转换为2000 ~ 2069,‘70’ ~
‘99’ 被转换为 1970 ~ 1999
(4)格式:以2位数字格式表⽰的YEAR ,范围为1 ~ 99 其中,1 ~69 被转换为2001 ~ 2069 ,70 ~99被转换为 1970 ~ 1999
2、TIME :
(1)TIME 类型的格式为HH:MM:SS ,HH表⽰⼩时 MM 表⽰分钟 SS 表⽰秒
(2)格式:以‘HHMMSS’格式表⽰的TIME 例如‘101112’ 被理解为10:11:12 但如果插⼊不合法的时间,如‘109712’,则呗存储为 00:00:00
(3)格式:以‘D HH:MM:SS’字符串格式表⽰的TIME 其中D 表⽰⽇ 可以去0-34之间的值,在插⼊数据库的时候D 会被转换成⼩时
如‘2 10:10’ 在数据库中表⽰为58:10:00 即2x24+10 =58
3、DATE:
(1)DATE 类型的格式为 YYYY-MM-DD,其中 ,YYYY表⽰年 MM 表⽰⽉ DD 表⽰⽇
(2)格式:‘YYYY-MM-DD’或‘YYYYMMDD’, 取值范围为‘1000-01-01’ ~ ‘9999-12-31’
(3)格式:‘YY-MM-DD’或‘YYMMDD’,这⾥YY 表⽰两位的年值 范围为‘00 - 99’,其中,‘00’~‘69’被转换为2000 ~ 2069,‘70’ ~‘99’ 被转换为 1970 ~ 1999
(4)格式:YY-MM-DD 或 YYMMDD, 数字格式表⽰的⽇期 其中YY 范围为00-99,其中,‘00’~‘69’被转换为2000 ~image是什么格式
2069,‘70’ ~‘99’ 被转换为 1970 ~ 1999
4、DATETIME
(1)DATETIME 类型的格式为YYYY-MM-DD HH:MM:SS, 其中,YYYY 表⽰年,MM 表⽰⽉,DD 表⽰⽇,HH 表⽰⼩时,MM 表⽰分钟,SS 表⽰秒
(2) 格式:‘YYYY-MM-DD HH:MM:SS’ 或 ‘YYYYMMDDHHMMSS’ ,字符串格式,取值范围为 ‘1000-01-01 00:00:00’ ~‘9999-12-31 23:59:59’
(3) 格式:‘YY-MM-DD HH:MM:SS’ 或 ‘YYMMDDHHMMSS’ ,字符串格式,其中 YY 范围为 ‘00’ ~ ‘99’ ,其
中,‘00’ ~ ‘69’ 被转换为 2000 ~ 2069 ,‘70’ ~ ‘99’ 被转换为 1970 ~ 1999
(4) 格式:YYYYMMDDHHMMSS 或 YYMMDDHHMMSS ,数字格式,取值范围同上
5、TIMESTAMP
(1) TIMESTAMP 类型的格式为 YYYY-MM-DD HH:MM:SS,显⽰宽度固定在19个字符
(2) TIMESTAMP 与 DATETIME 的区别在于,TIMESTAMP 的取值范围⼩于 DATETIME 的取值范围
(3) TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC ,其中 UTC 是世界标准时间,存储时会对当前时区进⾏转换,检索时再转换回当前时区
四、字符串类型
1.字符串类型⽤来存储字符串数据,还可以存储⽐如图⽚和声⾳的⼆进制数据
2.MySQL⽀持两种字符串类型:⽂本字符串和⼆进制字符串
VARBINARY的存储需求是L+1,L<M
五、如何选择数据类型
1.整数和浮点数及定点数
(1)如果不需要⼩数部分,则使⽤整数来保存数据,如果需要表⽰⼩数部分,则使⽤浮点数类型和定点数。对于浮点数据列,存⼊的数值会对该列定义的⼩数位进⾏四舍五⼊
(2)浮点数类型中,DOUBLE类型精度⽐FLOAT类型⾼,因此,如果要求存储精度较⾼时,应选择DOUBLE类型,当然DOUBLE它占⽤的存储空间要⼤⼀些。
(3)浮点数相对于定点数DECIMAL的优势是:在长度⼀定的情况下,浮点数能表⽰的数据范围更⼤。但是由于浮点数容易产⽣误差,因此对精度要求⾼,建议⽤定点数
(4)DECIMAL在MySQL当中是以字符串存储的,⽤于定义货币等对精度要求⾼的数据。在数据迁移中,FLOAT(M,N)是⾮标准的SQL定义,所以数据迁移时可能会出现问题,最好不要⽤。
(5)另外两种浮点数在进⾏运算的时候也容易出问题,所以如果进⾏数值⽐较,最好⽤定点数
2.⽇期和时间类型:
(1)如果只需要记录年份,⽤YEAR类型;如果只需要记录时间,⽤TIME类型
(2)如果同时记录⽇期时间,可以使⽤DATETIME或者是TIMESTAMP这两种类型;TIMESTAMP的取值范围⼩于DATETIME
(3)默认情况下,当插⼊⼀条记录但并没有指定TIMESTAMP这个列值时,MySQL默认会把TIMESTAMP列设为当前时间。
3.字符串:
3.1 CHAR和VARCHAR:
(1)CHAR(M)是固定长度字符,VARCHAR(M)是可变长度的字符;CHAR会⾃动删除插⼊数据尾部的空格,VARCHAR不会删除尾部空格
(2)CHAR是固定长度,所以它的处理速度⽐VARCHAR的速度更快,但是浪费存储空间
(3)具体选择CHAR还是VARCHAR类型,也要参考数据表的存储引擎。对于MyISAM引擎,最好使⽤固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从⽽使数据检索速度更快,⽤空间换时间。对于InnoDB引擎,使⽤可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使⽤CHAR不⼀定⽐使⽤VARCHAR更快,但由于VARCHAR是按照实际的长度来存储的,⽐较节省空间,对磁盘I/O和数据存储总量⽐较好。
3.2 BIT
(1)BIT数据类型⽤来保存位字段值,即以⼆进制的形式来保存数据;例如:保存数据13,则实际保存的是13的⼆进制值,1101;(2)BIT是位字段类型,BIT(M)中的M表⽰每个值的位数,范围为1–64,如果M被省略,则默认M为1,如果BIT(M)列分配的值长度⼩于M位,则在值得左边⽤\x00来填充
(3)如果需要位数⾄少为4位的BIT类型,即可定义BIT(4),则转换为⼆进制后⼤于1111的数据插⼊时会有误差,它只能显⽰位数为4的最⼤值。⽐如我们插⼊的值是16,16的⼆进制是10000,它的位数是5,但是规定是4,所以只能存⼊15,就产⽣了误差。
3.3 BINARY和VARBINARY
(1)BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是他们包含⼆进制字符串
(2)BINARY类型是固定长度的,指定长度后,不⾜最⼤长度,将在他们的右边填充\x00,以补齐指定长度
(3)VARBINARY类型的长度是可变的,指定长度之后,其长度可以在0到最⼤值之间
3.4 BLOB和TEXT
(1)BLOB是⼆进制字符串,TEXT是⾮⼆进制字符串,两者均可存放⼤容量信息。BLOB主要存放图⽚,⾳频等信息,⽽TEXT只能存放纯⽂本⽂件
3.5 ENUM和SET
(1)ENUM只能取单值(只能取它给出的值得其中之⼀),他的数据列表是⼀个枚举集合。它的列举的值最多可以有65535个
(2)SET可以取多个值。它的列表中最多可列举64个值
(3)ENUM和SET的值是以字符串形式出现的,但在内部MySQL以数值的形式进⾏存储的
ENUM
(1)在基本的数据类型中,⽆外乎就是写数字和字符串,但是某些事物是较难⽤数字和字符来准确的表⽰的。⽐如⼀周有7天,分别是Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,如果我们⽤数字0,1,2,3,4,5,6来表⽰这七天,那么多下来的数字该怎么办?⽽且这样设置很容易让数据出错,超出取值范围。这种情况下,我们就可以⽤枚举这种数据类型来⾃定义取值范围。ENUM是⼀个字符串对象,其值为表创建时,在字段中规定的ENUM列举出来的那些值中的⼀个。
语法:字段名 ENUM(‘值1’,‘值n’)
我们在取枚举中的值得时候还可以使⽤它的(索引)下标,下标的值从1开始
set
(1)SET是⼀个字符串对象,可以有零个或多个值,SET列最多可以有64个成员,其值为表创建时规定的⼀列值,语法:SET (‘值1’,“值2”,…‘值n’)
(2)与ENUM类型相同,SET 值在内部⽤整数表⽰,列表中每⼀个值都有⼀个索引标号
(3)与ENUM类型 不同的是,ENUM类型的字段只能从定义的列值中选择⼀个值插⼊,⽽SET类型的列可从定义的列值中选择多个字符的联合
(4)如果插⼊SET 字段中列值有重复,则MySQL⾃动删除重复的值,插⼊SET字段的值的顺序 并不重要,MySQL会在存⼊数据库是 按照定义的顺序显⽰
mysql> create table int_tb
-> (
-
> a TINYINT,
-> b SMALLINT,
-> c MEDIUMINT,
-> d INT,
-> e BIGINT
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc int_tb;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a | tinyint(4) | YES | | NULL | |
| b | smallint(6) | YES | | NULL | |
| c | mediumint(9) | YES | | NULL | |
| d | int(11) | YES | | NULL | |
| e | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> CREATE TABLE float_tb
-> (
-> a FLOAT(3,2),
-> B DOUBLE(5,3),
-
> C DECIMAL(5,3)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc float_tb;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a | float(3,2) | YES | | NULL | |
| B | double(5,3) | YES | | NULL | |
makefile编译命令| C | decimal(5,3) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create table date_tb
-> (
-> a YEAR,
-> b DATE,
-> c TIME,
-> d DATETIME,
-> e TIMESTAMP
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc date_tb;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| a | year(4) | YES | | NULL | |
plc字与 字或 异或 实例| b | date | YES | | NULL | |
| c | time | YES | | NULL | |
| d | datetime | YES | | NULL | |
| e | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+
5 rows in set (0.01 sec)
往表⾥插⼊数据的语法:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论