MYSQL数据类型

文章目录

      • 整数类型
      • 浮点数类型和定点数类型
      • 日期和时间类型
      • 字符串类型
        • CHAR和VARCHAR
        • TEXT类型
        • ENUM类型
        • SET类型
      • 二进制类型
        • 布尔类型
      • 总结:如何正确的选择数据类型

整数类型

整数类型 字节数 无符号取值范围 有符号取值范围 默认显示宽度(位)
TINYINT 1 0~255 -128~127 4
SMALLINT 2 0~65533 -32768~32768 6
MEDIUMINT 3 0~16777215 -8388608~8388608 9
INT 4 0~4294967295 -2147483648~2147483648 11
INTEGER 4 0~4294967295 -2147483648~2147483648 11
BIGINT 8 0~18447440… -9223372…~9223372… 20
  • 标准SQL中支持INTEGER和SMALLINT,其他的都是MYSQL扩展出来的。
  • 在MYSQL中INT和INTEGER完全相同
  • 定义字段时使用数据类型的基本语法:
    数据类型(显示宽度)
    如果不指定显示宽度,那么就是默认显示宽度,默认显示宽度可以显示该范围内所有的正负数,所以默认显示宽度的位数是符号位加上数字的位数,可以参考有符号取值范围。
	//几个默认取值的例子
	tinyint - 4
	smallint - 6
	mediumint - 9
	int - 11
	bigint - 20
  • 如果想让1显示为对应的0001这种形式(数字不足用0来填充)5,可以使用zerofill参数,不过MYSQL会自动加上UNSIGNED属性,也就是这种形式只能表示无符号数
  • 存储数时候必须要符合范围

浮点数类型和定点数类型

浮点数类型包括单精度浮点数(FLOAT)和双精度浮点数(DOUBLE)
定点数类型是DECIMAL类型

浮点数类型 字节数
FLOAT 4
DOUBLE 8
DECIMAL(M,D)或DEC(M,D) M+2
  • DECIMAL和DOUBLE的最大取值范围相同
    指定定点数的基本形式:
    DECIMAL(M,D)
    M参数是数据的总长度,不包括小数点。D参数是指小数点后的长度。
    注意:这种语法FLOAT和DOUBLE也是兼容的,但是不是标准用法,如果使用可能会在后续的数据库迁移上出现一些问题。如果插入值的精度高于实际定义的精度,系统会进行四舍五入处理,FLOAT和DOUBLE在四舍五入时不会报错,而DECIMAL会有警告。
  • 定点数是以字符串形式存储,因此其精度比浮点数要高,而且浮点数会出现误差,是一直存在的缺陷,如果对数据的精度要求比较高,选择定点数比较安全。

日期和时间类型

时间类型 字节数 取值范围
YEAR 1 1901~2155
DATE 4 1000-01-01~9999-12-31
TIME 3 -838:59:59~838:59:59
DATETIME 8 1000-01-01 00:00:00~9999-12-31 23:59:59
TIMESTAMP 4 19700101080001~20380119111407
  • YEAR类型
    YEAR类型的输入有两种方式: XXXXXX
    XXXX 就是正常的输入年份,可以是数字也可以是字符串 eg:2019
    XX输入两位字符串,‘00’ ~ '69’转换为2000 ~ 2069,‘70’ ~ ‘99’转换为’1970’ ~ ‘1999’
  • TIME类型
    TIME的标准输入格式为:“D HH:MM:SS”,转换后为"(D*HH):MM:SS"
    eg: 输入’2 11:30:50’ -> ‘59:30:50’
    但是我们常用的方式都是直接:“HH:MM:SS”
    eg: 输入’11:30:50’ -> ‘11:30:50’
    还可以这样写"HHMMSS"
    eg: 输入 ‘113050’ -> ‘11:30:50’
  • 常用获取当前时间:在存储时,直接插入CURRENT_TIME 或者 NOW()
  • DATE类型
    DATE类型的输入: ‘YYYY-MM-DD’ ‘YYYYMMDD’
    还兼容一些不严格的语法 ‘YYYY/MM/DD’ ‘YYYY@MM@DD’ 'YYYY.MM.DD’不建议这样写
  • DATETIME类型
    DATETIME类型可以直接用DATE类型和TIME类型组合。
    格式:‘YYYY-MM-DD HH:MM:SS’ 或者 ‘YYYYMMDDHHMMSS’
  • TIMESTAMP类型
    TIMESTAMP基本和DATETIME类似,它的最大表示范围较小,需要表示的时间范围较大时选择DATETIME。TIMESTAMP可以根据时区来进行显示,在东八区的时间放在东七区进行显示,时间就会发生变化。

字符串类型

CHAR和VARCHAR

1.CHAR和VARCHAR都是在创建表的时候指定了最大长度,基本形式如下:
字符串类型(M)
其中M指定了该字符串的最大长度为M
2.CHAR类型的长度是固定的,在创建后长度不可改变。其长度可以是0~255的任意值。
   VARCHAR类型的长度是可变的,在创建后长度可以在VARCHAR允许范围内变化。定义时,其最大值可以取0~65535之间。在指定M范围内,使用多少,分配多少。
举个例子来说CHAR和VARCHAR的区别:
用一个表格来描述:

存储字符串 字段类型 是否可以存储 实际所占长度
ab CHAR(5) 可以 5
ab VARCHAR(5) 可以 3
abcdefg CHAR(6) 不可以 /
abcdefg VARCHAR(6) 可以 8

注意:VARCAHR存储的实际长度是字符串长度+1,这是因为字符串的结束标志用了一个字节,CHAR指定长度比字符串长度小时不可以存储。

TEXT类型

TEXT类型是一种特殊的字符串类型,用于存储一些文章内容等字符很多的字符串。
TEXT类型包括:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
将这几种做对比:

类型 允许的长度 存储空间
TINYTEXT 0~255字节 值的长度+2个字节
TEXT 0~65535字节 值的长度+2个字节
MEDIUMTEXT 0~167772150字节 值的长度+3个字节
LONGTEXT 0~4294967295字节 值的长度+4个字节

根据实际的需求选用合适的TEXT类型会更节省空间。

ENUM类型

ENUM类型又称枚举类型,在创建表的时候,ENUM类型的取值范围就以列表的形式指定了。基本形式如下:
属性名 ENUM(‘值1’,‘值2’,‘值3’…‘值n’)
ENUM类型的值只能从表中取出一个元素,最多有65535个值,系统会给每一个值对应上一个编号,在存储数据时,存储的是这个编号。
当ENUM类型加上NOT NULL属性后,其默认值为取值列表的第一个元素。如果不加该约束,则默认值为NULL。

SET类型

SET与ENUM类似,但是SET可以取多个元素,定义的基本形式如下:
属性名 SET(‘值1’,‘值2’,‘值3’…‘值n’)
SET的很多方面和ENUM类似,在插入数据时,以括号的形式来写

//插入set类型为(A,B,C)
INSERT INTO XXX(name,hobby) VALUES ('XiaoMing','A,B,C');

二进制类型

二进制类型用来存储二进制数据
二进制类型包括:BINARY,VARBINARY,BIT,TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB
先通过一张表来进行对比

二进制类型 取值范围
BINARY(M) 字节数为M,允许的长度为0~M的定长二进制字符串
VARBINARY(M) 允许长度为0~M的变长二进制字符串,字节数为值的长度+1
BIT(M) M位二级制数据,M的最大值为64
TINYBLOB 可变长二进制数据,最多255个字节
BLOB 可变长二进制数据,最多(2^16-1))
MEDIUMBLOB 可变长二进制数据,最多(2^24-1)
LONGBLOB 可变长二进制数据,最多(2^32-1)
  • BINARY(M),VARBINARY(M)
    这两个数据类型可以类比CHAR,VARCHAR
  • BIT(M)是一个二进制数据,M的最大值为64,在查询BIT类型的时候,需要用BIN(字段名+0)来将值转换为二进制显示。
	//这样写才会以二进制进行显示
	SELECT BIN(b+0) FROM bt;
  • BLOB
    BLOB类型可以分为TINYBLOB ,BLOB ,MEDIUMBLOB ,LONGBLOB
    BLOB类型是一种特殊的二进制类型,BLOB可以用来保存数据量很大的二进制数据,可以类比TEXT来理解,BLOB类型可以存储如图片,PDF等。

布尔类型

在SQL标准中,存在BOOL和BOOLEAN类型,MySQL为了支持SQL标准,也可以定义BOOL和BOOLEAN。但是在最后,这两个类型被转为了TINYINT(1),所以可以直接使用TINYINT(1)

总结:如何正确的选择数据类型

  • 数字类型:
    选择数字类型,首先需要看是小数还是整数,如果是整数的话根据范围去判断选择哪种数据类型。如果数字的范围不超过255,选用TINYINT,一般无特殊要求,最常用的数字类型是INT。
    如果是小数类型,定点数的精度比浮点数精度高,如果对数字的精度要求高,就必须使用定点数。如果没有特殊要求,也可以使用FLOAT和DOUBLE,如果小数点后有10位以上,应该选用DOUBLE。
  • 字符串类型:
    根据上面的介绍,明显VARCHAR会比CHAR要灵活,存储范围是可变的,这样会更节省空间。但是CHAR比VARCHAR的处理速度要快,对于长度变化不大的最好选用CHAR。
  • 日期类型:
    如果只需要记录年份,那么选择YEAR
    如果只需要记录时间,那么选择TIME
    如果只需要记录日期,那么选择DATE
    如果记录日期和时间,可以选择DATETIME和TIMESTAMP,DATETIME的表示范围较大。如果需要根据时区来显示,使用TIMESTAMP。
  • TEXT,BLOB
    TEXT用来存储字符,BLOB存储二进制数据。

你可能感兴趣的:(数据库,数据类型,MYSQL,数据库)