MySQL——字段类型

 

引言

数据库可以存储不同数据类型的数据,与此对应,需要为不同的数据类型设置与其对应的字段类型,以便于数据能够按正确的格式存储。
选择合适的字段类型,能够提高数据库存取数据的效率,也能够节省数据存储空间,提高数据库可用性。

MySQL 支持多种数据类型,但大致可以分为三类:数值、日期/时间和字符串(字符)类型

一、数值类型

类型取值范围大小
TINYINT(-128, 127)1 字节

SMALLINT

(-32768, 32767)2 字节
MEDIUMINT(-8388608, 8388607)3 字节
INT/INTEGER(-2 147 483 648, 2 147 483 647)4 字节
BIGINT(-2^63, 2^63-1)8 字节
FLOAT(M, D)

(-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)

4 字节
DOUBLE(M, D)

(-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 E+308)

8 字节
DECIMAL(M, D)依赖于M和D的值如果M>D,为M+2否则为D+2

 

二、日期/时间类型

类型大小取值范围格式用途
DATE3字节1000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3字节'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR1字节1901/2155YYYY年份值
DATETIME8字节1000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP4字节

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS混合日期和时间值,时间戳

 

三、字符串类型 

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

四、字段类型char、varchar和text的区别 

在MySQL中,charvarchartext类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。

它们的存储方式和数据的检索方式也都不一样,数据的检索效率是:char varchar text

 

char:

  1. 存储定长数据,因为其长度固定,方便程序的存储与查找,所以char字段上的索引效率级高
  2. char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率
  3. char必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充)
  4. 在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格
  5. char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节

varchar:

  1. 存储变长数据,但存储效率没有char高
  2. 必须在括号里定义长度,可以有默认值
  3. 保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留
  4. 另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度
  5. varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节

text:

  1. 存储可变长度的非Unicode数据,最大长度为2^31-1个字符
  2. text列不能有默认值,存储或检索过程中,不存在大小写转换
  3. 后面如果指定长度,不会报错误,但是这个长度是不起作用的

 

关于存储空间:

在使用UTF8字符集的时候,MySQL手册上是这样描述的:

  • 基本拉丁字母、数字和标点符号使用一个字节;
  • 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
  • 韩语、中文和日本象形文字使用三个字节序列。

 

总结:

1、经常变化的字段用varchar;

2、知道固定长度的用char;

3、超过255字节的只能用varchar或者text;

4、能用varchar的地方不用text;

5、能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;

6、同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表,原因参考 优化InnoDB表BLOB,TEXT列的存储效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值