MySQL的10种常用数据类型

article/2025/9/27 8:21:21

MySQL的数据类型

常用的数据类型有:

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

1、整数(xxxint)

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

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

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

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的同义词。

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

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、日期时间类型

对于year类型,输入的是两位,“00-68”表示2000-2069年,“70-99”表示1970-1999年。记得比较麻烦,建议使用4位标准格式。

'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS','YYYY-MM-DD'或'YY-MM-DD'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的。

'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523'和'970523'被解释为 '1997-05-23',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为'0000-00-00'。

对于包括日期部分间隔符的字符串值,如果日和月的值小于10,不需要指定两位数。'1979-6-9'与'1979-06-09'是相同的。同样,对于包括时间部分间隔符的字符串值,如果时、分和秒的值小于10,不需要指定两位数。'1979-10-30 1:2:3'与'1979-10-30 01:02:03'相同。

数字值应为6、8、12或者14位长。如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。如果数字 是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。其它数字被解释为仿佛用零填充到了最近的长度。

一般存注册时间、商品发布时间等,不建议使用datetime存储,而是使用时间戳,因为datetime虽然直观,但不便于计算。而且timestamp还有一个重要特点,就是和时区有关。

6、字符串型

char,varchar,text区别

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

char如果不指定(M)则表示长度默认是1个字符。varchar必须指定(M)。

char(M)类型的数据列里,每个值都占用M个字符,如果某个长度小于M,MySQL就会在它的右边用空格字符补足(在检索操作中那些填补出来的空格字符将被去掉;如果存入时右边本身就带空格,检索时也会被去掉);在varchar(M)类型的数据列里,每个值只占用刚好够用的字符再加上一个到两个用来记录其长度的字节(即总长度为L字符+1/2字字节)。[I1]

由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多,但相对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例。

text文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用char,varchar来代替。还有text类型不用加默认值,加了也没用。

哪些情况使用char更好

一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

MyISAM和MEMORY存储引擎中无论使用char还是varchar其实都是作为char类型处理的。

除此之外,建议使用varchar类型。特别是InnoDB存储引擎。

7、二进制值类型(了解)

包括:xxxBLOB和xxxBINARY

BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。当保存BINARY(M)值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。分别与四种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应有相同的最大长度和存储需求。在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。BLOB和TEXT列不能有默认值。BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。

8、枚举(ENUM)

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

可以插入空字符串""和NULL(如果运行NULL的话)。

如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),如果是严格模式,将不能插入,如果是非严格模式,将选用第一个元素代替,并警告。

ENUM最多可以有65,535个成员,需要2个字节存储。

当创建表时,ENUM成员值的尾部空格将自动被删除。

值的索引规则如下:

来自列规定的允许的值列中的值从1开始编号。

空字符串错误值的索引值是0。

NULL值的索引是NULL。

9、集合(SET)

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

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

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

10、特殊的NULL类型

Null类型特征:

(1)所有的类型的值都可以是null,包括int、float等数据类型

(2)空字符串””,不等于null,0也不等于null,false也不等于null

(3)任何运算符,判断符碰到NULL,都得NULL

(4)NULL的判断只能用is null,is not null

(5)NULL 影响查询速度,一般避免使值为NULL

面试:

为什么建表时,加not null default '' / default 0

答:不想让表中出现null值.

为什么不想要的null的值

答:(1)不好比较,null是一种类型,比较时,只能用专门的is null 和 is not null来比较.

碰到运算符,一律返回null

(2)效率不高,影响提高索引效果.

因此,我们往往,在建表时 not null default ''/0

(4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符)


http://chatgpt.dhexx.cn/article/XWNlHvdy.shtml

相关文章

定点数除法

定点数除法 一&#xff0c;手工除法运算方法二&#xff0c;原码除法运算方法三&#xff0c;原码加/减交替除法运算方法&#xff08;不恢复余数法&#xff09;四&#xff0c;原码加/减交替除法实现逻辑五&#xff0c;阵列除法 一&#xff0c;手工除法运算方法 图 1 图1 图1 二&…

浮点数与定点数理解、定点数转浮点数相互转换

1、浮点数理解 在平常的代码编写中大家经常用到float 32、double 64等&#xff0c;但是否有深入的去了解一下这类数据是怎么表示的呢&#xff1f;今天我们就去学习浮点数的表示方法&#xff0c;以及其优缺点。 首先浮点数为什么叫浮点数呢&#xff1f;因为浮点数的小数点的位…

定点数的几种表示形式

第二章 数制与编码 2.1 进制之间的转换 掌握&#xff1a;二进制、八进制、十六进制(末位加H表示)、十进制及彼此之间的转换&#xff1b; 问&#xff1a;小数怎么转换&#xff1f; 十进制转二进制&#xff1a;乘以权值再累加&#xff0c;如小数点后第一位的权值是2^(-1) 二进…

计算机中定点数表示方法练习

1【单选题】针对8位二进制数,下列说法中正确的是 。&#xff08;5.0分&#xff09; A、-127的补码为10000000 B、-127的反码等于0的移码 C、1的移码等于-127的反码 D、0的补码等于-1的反码 正确答案&#xff1a; B 2【单选题】若某数x的真值为-0.1010,在计算机中该数表示为1.0…

定点数的表示和运算

本文主要介绍以下几方面知识&#xff1a; 定点数的表示&#xff08;无符号数、有符号数&#xff09;移位运算&#xff08;原码、反码、补码&#xff09;加减运算&#xff08;原码加减、补码加减&#xff09;乘法运算&#xff08;原码乘法、补码乘法&#xff09;除法运算&#x…

进制以及浮点数和定点数

文章目录 一&#xff0c;进制&#xff08;1&#xff09;全国各地最熟悉也最习惯的进制--十进制数1.十进制2.基数3.十进制数的权位展开式4.十进制权位展开式的理解5.十进制对于计算机的局限 &#xff08;2&#xff09;计算机所能理解的进制--二进制数1.二进制2.数据存储3.常见信…

定点数的乘除运算

定点数的乘除运算 定点数的乘法运算原码一位乘法手算模拟补码一位乘法&#xff08;Booth算法&#xff09; 定点数的除法法运算原码除法运算恢复余数法不恢复余数法 补码除法运算&#xff08;加减交替法&#xff09;总结 定点数的乘法运算 在计算机中&#xff0c;乘法运算由累加…

定点数的加减法

文章目录 1.补码加法1.1 补码加法公式1.2 补码加法公式证明 2.补码减法3.溢出概念与检测方法3.1 溢出的概念3.2 溢出的检测方法 参考文献 数值运算的核心是指加、减、乘、除四则算术。由于计算机中的数有定点和浮点两种表示形式&#xff0c;因此相应有定点数的运算和浮点数的运…

定点数类型

正因为用浮点数表示小数可能会有不精确的情况&#xff0c;在一些情况下我们必须保证小数是精确的&#xff0c;所以设计MySQL的大叔们提出一种称之为定点数的数据类型&#xff0c;它也是存储小数的一种方式&#xff1a; 其中&#xff1a; M表示该小数最多需要的十进制有效数字个…

定点数的表示

计算机中常用的数据表示格式有两种&#xff0c;一是定点格式&#xff0c;二是浮点格式。所谓定点数和浮点数&#xff0c;是指在计算机中一个数的小数点的位置是固定的还是浮动的&#xff1a;如果一个数中小数点的位置是固定的&#xff0c;则为定点数&#xff1b;如果一个数中小…

定点数运算

reference: http://wenku.baidu.com/link?urlnUzHmqrtKkQ4fOfUb2SW7hBEGS47wlJEw1DS6uW3U3onryAWk-XWlkLHwd3tKbxhoFYDzeDEd3cjYr5ww-MKgpTP_lNYLkjwpXuatw11ply 原补码关系,参考&#xff1a;http://blog.csdn.net/limanjihe/article/details/52440638 补码的设计目的:   …

定点数的表示方法

文章目录 1.定点数的表示形式2.定点数的原码、反码与补码3.定点小数注意事项参考文献 计算机中数值的表示有两种形式&#xff0c;一是定点数&#xff08;Fixed-point Number&#xff09;&#xff0c;二是浮点数&#xff08;Floating-point Number&#xff09;。 1.定点数的表示…

定点数(fixed-point number)的运算

定点数的运算 1. 定点数2. 定点数加减运算3. 定点数加减运算的溢出判断3.1 用一位符号位判断溢出3.2 用两位符号位判断溢出3.3 最高位和次高位判断溢出 4. 乘法运算4.1 分析笔算乘法4.2 笔算乘法的改进4.3 图示4.4 硬件配置4.5 表格示意图 5. 除法运算5.1 分析笔算除法5.2 笔算…

[计算机组成原理]2-4、定点数详解

定点数详解 看笔记一定要心静&#xff0c;慢慢来不急。 定点数解释为小数点固定的数。 我们平常使用的数字大部分都属于定点数。比如1.0&#xff1b;110&#xff1b;192.168等等。这么说可能我们对定点数还是没有什么概念&#xff0c;毕竟没有参照物&#xff0c;那么与定点数…

Java枚举类实现

一、枚举类的特点 1.类的对象只有有限个&#xff0c;且为静态常量 2.当需要定义一组常量时&#xff0c;强烈建议使用枚举类 二、如何定义枚举类 jdk1.5之前&#xff1a;自定义枚举类 jdk1.5 :可以使用enum关键字来定义枚举类 2.1自定义枚举类实现&#xff1a; package enumte…

java枚举

为什么需要枚举&#xff1f; 一些方法在运行时&#xff0c;它需要的数据不能是任意的&#xff0c;而必须是一定范围内的值&#xff0c;比如成绩Grade只能为ABCDE。此类问题在JDK5以前采用自定义带有枚举功能的类解决&#xff0c;Java5以后可以直接使用枚举予以解决。枚举…

Java枚举中定义属性

文章目录 1、复习枚举2、自定义属性3、自定义属性枚举类和常量的对比4、常用方法5、枚举自定义属性在开发中的应用&#xff1a;字典表6、补充&#xff1a;入参校验 刚接触枚举时的例子太简单&#xff0c;就一个Season枚举类&#xff0c;里面四个常量值&#xff0c;后来开发中看…

Java 枚举(Enum)使用

文章目录 枚举引入enum关键字实现枚举enum关键字实现枚举注意事项enum常用方法一览表enum课堂练习enum实现接口 枚举引入 创建Season类, 实例化春夏秋冬四个实例 Season对象有如下特点 1.季节的值是有限的几个值(spring, summer, autumn, winter) 2.只读&#xff0c;不需要修…

Java枚举详解

目录 Java枚举详解 基本介绍 1.自定义类实现枚举 2.使用enum关键字实现枚举 使用enum关键字实现枚举的注意事项 enum的常用方法 enum的使用细节 Java枚举详解 基本介绍 枚举对应英文(enumeration,简写 enum) 枚举是一组常量的集合 枚举属于一种特殊的类&#xff0c;里…

Java枚举(enum)

枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组带标识符的常数。枚举在曰常生活中很常见&#xff0c;例如一个人的性别只能是“男”或者“女”&#xff0c;一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为…