最全 SQL 字段类型(4种)属性(6种)总结

Posted YuLong~W

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最全 SQL 字段类型(4种)属性(6种)总结相关的知识,希望对你有一定的参考价值。

字段类型

字段类型mysql中用来规定实际存储的数据格式

  • 字段类型在定义表结构时设定
  • 设定好字段类型后,插入数据时必须与字段类型对应,否则数据错误
  • 字段类型的作用就是强制规范录入的数据格式
    • 规范数据的格式
    • 保证数据的有效性
  • MySQL有四大数据类型
    • 整数类型:只能存储整数
    • 小数类型:可以存储有效数值
    • 字符串类型:存储字符串数据
    • 时间日期类型:存储时间日期格式数据

整数类型

整数类型:有效的整数数据

  • MySQL中为了数据空间的有效使用,设定了五种整数类型
    • 迷你整型:tinyint,使用1个字节存储整数,最多存储256个整数(-128~127)
    • 短整型:smallint,使用2个字节存储整数
    • 中整型:mediumint,使用3个字节存储整数
    • 标准整型:int,使用4个字节存储整数
    • 大整型:bigint,使用8个字节存储
  • 数值型存储在MySQL中分为有符号(有负数)和无符号(纯正数)需要unsigned 修饰整型

示例:设计一个表记录个人信息:年龄、头发数量

# 年龄:没有负数,正常年龄也不超过200岁,迷你整型无符号即可
# 头发数量:没有负数,大概在几百万根,所以标准整型无符号即可
create table t_7(
	age tinyint unsigned, # unsigned修饰整数,表示无符号(从0开始)
    haircount int unsigned
)charset utf8;

显示宽度:int(L),整数在数据库中显示的符号(数字+符号)个数

  • 显示宽度一般是类型能表示的最大值对应的数字个数(通过desc查看表字段显示)
  • 显示宽度包含符号(如果允许为负数,-负号会增加一个宽度)
  • 显示宽度可以主动控制:创建字段时加括号确定
  • 显示宽度不会影响类型能表示的最大数值
  • 可以通过zerofill让不够宽度的数值补充到对应宽度:在字段类型后使用zerofill

小数类型(2种)

1、浮点型float / double,存储不是特别精确的数值数据

  • 浮点数又称之为精度数据,分为两种
    • 单精度:float,使用4个字节存储,精度范围为6-7位有效数字
    • 双精度:double,使用8个字节存储,精度范围为14-15位有效数字
  • 浮点数超过精度范围会自动进行四舍五入
  • 精度可以指定整数和小数部分
    • 默认不指定,整数部分不超过最大值,小数部分保留2位
    • 可以指定:float/double(总长度,小数部分长度)
  • 可以使用科学计数法插入数据:AEB,A * 10 ^ B
  • 因为浮点数会自动四舍五入,所以不要使用浮点数来存储对精度要求较高的数值

示例:记录商品的价格

# 商品名字字符串
# 商品价格一般都允许带小数
create table t_11(
	goods_name varchar(20),
    goods_price float
)charset utf8;
insert into t_11 values('Nokia3310',199.99);
insert into t_11 values('Nokia6100',1999.9999);

2、定点型decimal,能够保证精度的小数

  • 定点数的存储模式不是固定长度,所以数据越大占用的存储空间越长
  • 每9个数字使用4个字节存储
  • 定点型可以指定整数部分长度和小数部分长度
    • 默认不指定,10位有效整数,0位小数
    • 可以指定:decimal(有效数位,小数部分数位)
    • 有效数位不超过65个
  • 数据规范
    • 整数部分超出报错
    • 小数部分超出四舍五入

示例:记录个人资产情况:资产和负债

# 资产和负债应该都是精确的,小数部分可以到分
create table t_12(
    money decimal(14,2),
    bet decimal(10,2)
)charset utf8;

insert into t_12 values(1111111111.12,1111111.999);
insert into t_12 values(1111111111.12,99999999.999); # 错误:进位导致正数部分超过指定范围

字符串类型(5种)

1、定长型char(L),指定固定长度的存储空间存储字符串

  • 定长是指定存储长度
  • 定长的长度是字符而不是字节
    • L的最大值是255
    • 实际存储空间:L字符数 * 字符集对应字节数
  • 定长里存储的数据不能超过指定长度,但是可以小于指定长度
  • 字符串数据使用单引号或者双引号包裹
  • 定长的访问效率较高,但是空间利用率较低

示例:记录个人信息:身份证信息和手机号码

# 身份证为固定长度18位(数字)
# 手机号码是11位固定长度(数字)
create table t_13(
	id_number char(18),
    phone_number char(11)
)charset utf8;
insert into t_13 values('440111999912120304','13512345678');

2、变长型varchar(L),根据实际存储的数据变化存储空间

  • 变长型的存储空间是由实际存储数据决定的
  • 变长型的L也是指字符而不是字节
    • L指定的是最大存储的数据长度
    • L最大值理论是65535
    • 变长需要额外产生1-2个字节,用来记录实际数据的长度
      • 数据长度小于256个,多1个字节
      • 数据长度大于256个,多2个字节
    • 实际存储空间:实际字符数 * 字符集对应字节数 + 记录长度
  • 变长数据不能超过定义的最大长度
  • 变长字符串在读取时需要进行长度计算,所以效率没有定长字符串高
  • 变长字符串能够更好的利用存储空间

示例:记录个人信息:用户名、密码、姓名、身份证

# 用户名不确定长度,最长不超过50个字符
# 密码不确定长度,最长超过15个字符
# 姓名不确定长度,最长不超过10个字符
# 身份证固定长度,18个字符
create table t_14(
	username varchar(50),
    password varchar(15),
    name varchar(10),
    id_number char(18)
)charset utf8;

insert into t_14 values('username','password','name','444111999912121111');

3、文本字符串text/blob,专门用来存储较长的文本

  • 文本字符串通常在超过255个字符时使用
  • 文本字符串包含两大类
    • text:普通字符
      • tinytext:迷你文本,不超过2 ^ 8 -1个字符
      • text:普通文本,不超过 2 ^ 16 - 1个字符
      • mediumtext:中型文本,不超过 2 ^ 24 - 1 个字符
      • longtext:长文本,不超过 2 ^ 32 - 1 个字符(4G)
    • blob:二进制字符(与text类似)
      • tinyblob
      • blob
      • mediumblob
      • longblob
  • 文本字符串会自动根据文本长度选择适合的具体类型
  • 一般在文本超过255个字符时,都会使用text(blob现在极少使用)

示例:记录新闻信息:标题、作者和内容

# 标题一般不会超过50个字符,varchar
# 作者一般不会超过10个字符:varchar
# 内容通常都很长,使用text
create table t_15(
	author varchar(10),
    title varchar(50),
    content text
)charset utf8;

insert into t_15 values('佚名','给联合国的一封信','给联合国的一封信...');

4、枚举型enum, 一种映射存储方式,以较小的空间存储较多的数据

  • 枚举是在定义时确定可能出现的可能,而后数据只能出现定义时其中的一种的数据类型
  • 枚举类似一种单选框
  • 枚举使用1-2个字节存储,最多可以设计65535个选项
  • 枚举实际存储是使用数值,映射对应的元素数据,从1开始
  • 枚举语法:enum(元素1,元素2,...元素N)
  • 使用枚举的作用:
    • 规范数据模型
    • 优化存储空间

示例:记录人群类型:小朋友、少年、青年、中年、老年,每个人实际只属于一种类别

# 要保证未来数据只能出现在某种可能中,所以要先列出来,可以使用enum
create table t_16(
	type enum('小朋友','少年','青年','中年','老年')
)charset utf8;

insert into t_16 values('少年');
insert into t_16 values('仙人');	# 不存在的数据不能插入

枚举定义原理:

枚举数据映射值
数据11
数据22
数据NN(小于65535)

数据存储(读取反过来):

指令开始
插入数据
读取映射关系
元素==数值
数值==数值
数值存储到字段
结束

5、集合型set,一种映射存储方式,以较小的空间存储较多的数据

  • 集合是在定义时确定可能出现的元素进行穷举,而后数据只能出现定义时其中的元素(可以是多个
  • 集合类似一种多选框
  • 集合使用1-8个字节存储数据,最多可以设计64个元素
  • 集合实际存储是使用数值(二进制位),映射对应的元素数据,每个元素对应一个比特位
    • 数据存在:对应位为 1
    • 数据不存在:对应位为 0
  • 集合语法:set(元素1,元素2,...元素N)
  • 使用集合的作用:
    • 规范数据模型
    • 优化存储空间

示例:记录个人的球类爱好,有篮球、足球、羽毛球、网球、乒乓球、排球、台球、冰球

# 爱好可以是多种,并非固定的,但是只能从规定的类型中选择
create table t_17(
	hobby set('足球','篮球','羽毛球','网球','乒乓球','排球','台球','冰球')
)charset utf8;

insert into t_17 values('足球');
insert into t_17 values('冰球,台球,篮球');

集合定义原理:

集合数据映射位
数据100000001
数据200000010
数据810000000

数据存储(读取反过来):

指令开始
插入数据
读取映射关系
元素选中==位值为1
元素未选中==位值为0
转化成十进制存储
结束

时间日期类型(5种)

1、年year,MySQL中用来存储年份的类型

  • MySQL中使用1个字节存储年份
  • year能够表示的范围是1901-2155年(256年)
    • year的特殊值是:0000
  • year允许用户使用两种方式设计(效果一样)
    • year
    • year(4)
  • 因为year字段表示的范围有限,所以通常会使用字符串来存储(牺牲空间换安全)

示例:记录个人的出生年份

create table t_18(
	y1 year,
    y2 year(4)
)charset utf8;
insert into t_18 values(1901mysql怎么获取数据表字段enum类型的默认值

面向对象理解,封装继承多态知识总结

SQL如何建立Date类型的字段

IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题

Mysql中用SQL增加删除字段,修改字段名字段类型注释,调整字段顺序总结

Mysql中用SQL增加删除字段,修改字段名字段类型注释,调整字段顺序总结