文章目录

  • 1、整型(xxxint)
  • 2、浮点型
  • 3、位类型
  • 4、定点型
  • 5、字符串型
  • 6、枚举(ENUM)
  • 7、集合(SET)
  • 8、特殊的NULL类型

常见的数据类型有:

  • 整型(xxxint)
  • 位类型(bit)
  • 浮点数(float和double、real)
  • 定点数(decimal、numeric)
  • 日期时间类型(date、time、datetime、year)
  • 字符串(char、varchar、xxxtext)
  • 二进制数据(xxxBlob、xxbinary)
  • 枚举(enum)
  • 集合(set)

1、整型(xxxint)

整型类型 字节 范围(有符号) 范围(无符号) 用途
TINYINT 1 (-128,127) (0,255) 小整数值
SMALLINT 2 (-32768,32767) (0,65535 ) 大整数值
MEDIUMINT 3 (-8388608,8388607) (0,1677215) 大整数值
INT、INTEGER 4 (-2147483648,2147483647) (0,4294967295 ) 大整数值
BIGINT 8 (-9223372036854775808,9223372036854775807) (0,18446744073709551615) 极大整数值

整型列的可选属性有三个:

  • M:宽度(在 0 填充的时候才有意义,否则不需要指定)
  • unsigned:无符号类型(非负)
  • zerofill:0 填充,(如果某列是 zerofill,那么默认就是无符号),如果指定了 zerofill 只是表示不够 M 位时,用 0 在左边填充,如果超过 M 位,只要不超过数据存储范围即可

原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用4 个字节的存储空间。

2、浮点型

对于浮点列类型,在 MySQL 中单精度值使用 4 个字节,双精度值使用 8 个字节。

  • MySQL 允许使用非标准语法(其他数据库未必支持,因此如果设计到数据迁移,则最好不要这么用):FLOAT(M,D)或 DOUBLE(M,D)。这里,(M,D)表示该值一共显示 M 位,其中 D 表示小数点后几位,M 和 D 又称为精度和标度。例如,定义为 FLOAT(5,2)的一个列可以显示为-999.99-999.99。M 取值范围为 0~255。D 取值范围为 0~30,同时必须<=M。
  • 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为 1000.01),MySql 就会报错,不允许存这样的值。如果存储时,小数点部分若超出范围,就分以下情况:若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存,例如在FLOAT(5,2)列内插入999.009,近似结果是999.01。若四舍五入后,整数部分超出范围,则 MySql 报错,并拒绝处理。如 999.995 和-999.995 都会报错。
  • 说明:小数类型,也可以加 unsigned,但是不会改变数据范围,例如:float(3,2) unsigned 仍然只能表示 0-9.99的范围。
  • float 和 double 在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示
  • REAL 就是 DOUBLE ,如果 SQL 服务器模式包括 REAL_AS_FLOAT 选项,REAL 是 FLOAT 的同义词而不是 DOUBLE的同义词。
类型 字节 范围(有符号) 范围(无符号) 用途
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 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对于DECIMAL(M,D),
如果M>D,为M+2,否则为D+2
依赖于M和D的值 依赖于M和D的值 小数值

注意:在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。如果希望保证值比较准确,推荐使用定点数数据类型。

3、位类型

  • BIT 数据类型可用来保存位字段值。BIT(M)类型允许存储 M 位值。M 范围为 1~64,默认为 1。
  • BIT 其实就是存入二进制的值,类似 010110。如果存入一个 BIT 类型的值,位数少于 M 值,则左补 0。如果存入一个 BIT 类型的值,位数多于 M 值,MySQL 的操作取决于此时有效的 SQL 模式:如果模式未设置,MySQL 将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为 traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据 SQL 标准插入会失败。
  • 对于位字段,直接使用 SELECT 命令将不会看到结果,可以用 bin()或 hex()函数进行读取。

4、定点型

  • DECIMAL 在 MySQL 内部以字符串形式存放,比浮点数更精确。定点类型占 M+2 个字节
  • DECIMAL(M,D)与浮点型一样处理规则。M 的取值范围为 0~65,D 的取值范围为 0~30,而且必须<=M,超出范围会报错
  • DECIMAL 如果指定精度时,默认的整数位是 10,默认的小数位为 0
  • NUMERIC 等价于 DECIMAL

5、字符串型

类型 说明 典型声明方式 范围
char 定长字符串 gender char(1) char(M)
0<=M<=255
varchar 变长字符串 email varchar(20) varchar(M)
0<=M<=65535
(大约2W~6W个字符,受字符集的影响)
text 文本串 content text 大约2W~6W个字符,受字符集的影响

char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。


char、varchar、text的区别

  • char是一种固定长度的类型,varchar则是一种可变长度的类型,他们的区别是:
  • char如果不指定(M)则表示长度默认是1个字符。varchar必须指定(M).
  • char(M)类型的数据列里,每个值都占用M个字符,如果某个长度小于M,MySQL就会在他的右边用空格字符补足(在检索操作中那些填补出来的空格字符将被去掉;如果存入时右边本身就带空格,检索时也会被去掉);在varchar(M)类型的数据列里,每个值只占用刚好够用的字符再加上一个到两个用来记录其长度的字节(即总长度为L字符+1/2个字节)
  • 由于某种原因 char 固定长度,所以在处理速度上要比 varchar 快速很多,但相对费存储空间,所以对存储不大,但在速度上有要求的可以使用 char 类型,反之可以用 varchar 类型来实例。
  • text 文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用 char,varchar来代替。还有 text 类型不用加默认值,加了也没用。

哪些情况使用char更好

  1. 存储很短的信息:比如门牌号码420,521……这样很短的信息应该用char,因为varchar还要占字节用于存储信息长度,本来打算节约存储的现在得不偿失;
  2. 固定长度的:比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占长度信息
  3. 十分频繁改变的column:因为varchar每次存储都有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
  4. MyISAM和MEMORY存储引擎中无论使用char还是varchar其实都是作为char类型处理的。
  5. 建议使用varchar类型,特别是InnoDB存储引擎。

6、枚举(ENUM)

MySql 中的 ENUM 是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值:

  • 可以插入空字符串""和 NULL(如果运行 NULL 的话)
  • 如果你将一个非法值插入 ENUM(也就是说,允许的值列之外的字符串),如果是严格模式,将不能插入,如果是非严格模式,将选用第一个元素代替,并警告
  • ENUM 最多可以有 65,535 个成员,需要 2 个字节存储
  • 当创建表时,ENUM 成员值的尾部空格将自动被删除

值的索引规则如下:

  • 来自列规定的允许的值列中的值从 1 开始编号
  • 空字符串错误值的索引值是 0
  • NULL 值的索引是 NULL

7、集合(SET)

SET 和 ENUM 类型非常类似,也是一个字符串对象,里面包含 0~64 个成员。

SET 和 ENUM 存储上有所不同,SET 是根据成员的个数决定存储的字节数。

SET 和 ENUM 最主要的区别在于 SET 类型一次可以选择多个成员,而 ENUM 则只能选择一个。

8、特殊的NULL类型

NULL类型的特征

  • 所有的类型的值都可以是null,包括int、float等数据类型
  • 空字符串"",不等于null,0也不等于null,false也不等于null
  • 任何运算符,判断符碰到NULL,都得NULL
  • NULL的判断只能用is null,is not null
  • NULL影响查询速度,一般避免使值为NULL

相关的面试题

1)为什么建表时,加not null default’’ / default 0

  • 不想让表中出现null值

2)为什么不想要的null的值

  • 不好比较,null是一种类型,比较时,只能用专门的is null 和is not null来比较。碰到运算符,一律返回null
  • 效率不高,影响提高索引的效果
  • 因此,在建表的时候,not null default ‘’/0

MySQL基础篇:数据类型相关推荐

  1. 最全MySQL基础篇

    文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...

  2. 深入浅出Mysql - 基础篇(列类型/运算符/函数)

    深入浅出Mysql - 基础篇(列类型/运算符/函数) 每一个常量.变量和参数都有数据类型,它用来指定一定的存储格式.约束和有效范围.MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时 ...

  3. MySQL基础篇——第11章 DML(数据操作):增删改

    MySQL基础篇--第11章 DML(数据操作):增删改 1. 插入数据(增) INSERT INTO ... 使用 INSERT INTO 语句向表中插入数据(记录) 1.1 方式1:VALUES ...

  4. MySQL——基础篇

    MySQL--基础篇 一.数据库的相关概念 数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件). 表(table) 某种特定类型数据的结构化清单. 模式(schema) 关 ...

  5. MySQL基础篇:子查询

    文章目录 概述 where型子查询 from型子查询 EXISTS型子查询 复制表子查询 概述 在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到** ...

  6. mysql 基础篇(二) 账号、权限管理

    mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...

  7. Mysql基础篇(1)—— 基础概念、DML基本语法和表连接

    前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) ​ 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...

  8. 【MySQL基础篇】数据导出导入权限与local_infile参数

    [MySQL基础篇]数据导出导入权限与local_infile参数 问题背景 数据导出测试 创建测试库(在主库进行) 测试数据导出(在从库进行) 测试数据导入(在主库进行) 问题背景 MySQL高可用 ...

  9. MySql基础篇---003 SQL之DDL、DML、DCL使用篇:创建和管理表 ,数据处理之增删改,MySQL数据类型精讲 ,约束:联合主键

    第10章_创建和管理表 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步.只有正确地 ...

  10. MySQL 基础————常用数据类型

    引言 从第一次学习mysql开始,不知道为什么MySQL的数据类型始终没有像Java 一样深入脑海,对某些数据类型的定义和用法,也并不清晰,这篇文章,就好好总结一番,将MySQL中几个常用的数据类型归 ...

最新文章

  1. CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()
  2. 洛谷P3388 【模板】割点(割顶)
  3. JavaFX 中 FX 一词的由来
  4. python中文件打开与关闭操作命令
  5. MATLAB对一个二维矩阵画三维图
  6. Jquery的ajax 三级联动 03
  7. AdaDelta算法
  8. 解二元一次方程————拓展欧几里得算法
  9. 同账号下阿里云ecs克隆——通过镜像更换系统
  10. 手机流量怎么修改dns服务器,手机上网速度慢怎么办?手动修改DNS为上网提速
  11. KindEditor 图片粘贴上传,实现图文粘贴,图片自动上传
  12. ThinkPad T460s BIOS设置实现U盘启动
  13. 那些坚持买彩票想中500万的人,都是一些什么心态?分析一下
  14. 天涯社区:寒门难出贵子
  15. 认知学派用计算机来比拟人,心理学基础习题解答.doc
  16. 安装 synaptic on ubuntu 18
  17. 【第六章 线性代数之 逆矩阵,列空间与零空间】3Blue1Brown
  18. 转专业计算机常见的名词解释,迎鲜肉第9弹|大学生活必知名词解释
  19. IntelliJ IDEA安装使用教程 亲测2019.2.4版本可行
  20. IBM林咏华:AI王牌炼成记——访IBM全球杰出工程师、人工智能系统技术总监、IBM中国研究院林咏华

热门文章

  1. XML DOM – 访问节点概述
  2. lammps linux运行命令,[转载]linux下 lammps的安装以及计算初步使用
  3. 宁波工程学院2020新生校赛(重现赛)部分题解
  4. [NC15748]旅游 树形dp基础
  5. codeforces数学1600day4[贪心数学公式推导CodeForces - 1151D ,思维CodeForces - 1085C,数论同余+组合计数 CodeForces - 1056B]
  6. c++把数组所有元素剔除_C语言基础之数组,第一节,C语言必学知识点剖析
  7. Build-dep linux 知乎,删除通过apt-get build-dep安装的软件包
  8. 前端入门(雨滴特效,css)
  9. c语言中的字节和元素,C语言指向数组元素的指针
  10. log函数 oracle power_数学函数