MySQL - 数据类型

目录

数据类型

- 整数类型:tinyint、smallint、mediumint、nt、bigint

- tinyint

- int

- bigint

- 整型存储范围

- 浮点类型:float、double

- float

- double

- DECIMAL(定点数类型)

- 字符串类型:char、varchar

- char

- varchar

- char vs varchar

- 位类型:bit

-BIT

- 日期类型:date、time、datetime、timestamp、year

- datetime & timetamp

- 枚举 and 集合

严格模式


数据类型

- 整数类型:tinyint、smallint、mediumint、nt、bigint

- tinyint

小数型,数据类型用于保存一些范围的整数数值范围。

范围:

  • 有符号:-128~127
  • 无符号:0~255

注:MySQL没有布尔值,使用tinyint(1)构造

- int

整数,数据类型用于保存一些范围的整数数值范围。

范围:

  • 有符号:-2147483648 ~ 2147483647
  • 无符号 : 0 ~ 4294967295

- bigint

大整数,数据类型用于保存一些范围的整数数值范围。

范围:

  • 有符号:-9223372036854775808 ~ 9223372036854775807
  • 无符号 : 0 ~ 18446744073709551615

- 整型存储范围

注:数据类型指定的宽度,例如 int(5),5指的是查询结果的显示宽度,与存储范围无关。默认的显示宽度为最大值+1。

另:

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

即:整形类型,其实没有必要指定显示宽度,使用默认的即可


- 浮点类型:float、double

- float

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30。

范围:

  • 有符号:
    -3.402823466E+38 to -1.175494351E-38,
    1.175494351E-38 to 3.402823466E+38
  • 无符号:
    1.175494351E-38 to 3.402823466E+38
  • 精确度:随着小数的增多,精度变得不准确

- double

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

双精度浮点数(非精确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30

范围:

  • 有符号:
    -1.7976931348623157E+308 to -2.2250738585072014E-308
    2.2250738585072014E-308 to 1.7976931348623157E+308
  • 无符号:
    2.2250738585072014E-308 to 1.7976931348623157E+308
  • 精确度:随着小数的增多,精度比float要高,但也会变得不准确

- DECIMAL(定点数类型)

dec同decimal

decimal[(m[,d])] [unsigned] [zerofill]

精确的小数值,m是数字总个数(负号不算),d是小数点后个数。m最大值为65,d最大值为30、

精确度:

  • **** 随着小数的增多,精度始终准确 ****
  • 对于精确数值计算时需要用此类型
  • decaimal能够存储精确值的原因在于其内部按照字符串存储。

 

- 字符串类型:char、varchar

- char

char(n)

用来固定长度的字符串,n为字符长度范围 0~255(一个中文是一个字符,是utf8编码的三个字节),超出范围报错

存储:默认会往右填充空格满足指定长度。

    如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

检索:在检索(查询)时,查出的结果会自动删除尾部空格。除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

- varchar

varchar(n)

用来存储变长字符类型,n为字符长度范围 0~65535(如果大于21845会提示用其他类型),超出范围报错

存储:

  • varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
  • 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
  • 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
  • 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

检索: 尾部有空格会保存下来,在检索(查询)时,也会正常显示包含空格在内的内容

- char vs varchar

  • char:固定长度,浪费空间,存取速度快
  • varchar:可变长度,节省空间,存取速度慢

总结:innoDB引擎:建议使用varchar类型。


- 位类型:bit

-BIT

BIT(M)

存放二进制数,M范围 1~64,默认为1位

注意:

  • 对于位字段需要使用函数读取
  •     bin()显示为二进制
  •     hex()显示为十六进制

- 日期类型:date、time、datetime、timestamp、year

YEAR
   YYYY(1901/2155)

DATE
   YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
   HH:MM:SS('-838:59:59'/'838:59:59')

DATETIME  

   YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

TIMESTAMP

   YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

- datetime & timetamp

在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。

1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。

2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。

3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。

4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。即,timestamp只要动了对应行数据,会自动更新修改时间。

- 枚举 and 集合

枚举(enum):字段的值只能在给定范围中选一个(单选)

sex enum('male','female');

集合(set):字段的值只能在给定范围中选择(可多选)

hobby set('play','music','read','study') :

严格模式

如果插入的数字不在相应类型的范围内,依旧可以插入。

严格模式:如果插入数字不在相应范围内,则报错。

设置方式:

  • 查看当前模式 : show variables like "sql_mode";
  • 修改为严格模式:set global sql_mode = "STRICT_TRANS_TABLES";
  • 不需要重启,直接可以执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值