mysql字段类型、范围详解

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

TINYINT:有符号的范围是-128至127,无符号的范围是0到255,2的8次方【存储大小为 1 字节大小】

SMALLINT: 有符号的范围是-32768至32767,无符号的范围是0到65535,2的16次方【存储大小为 2 个字节大小】

MEDIUMINT:有符号的范围是-8388608至8388607,无符号的范围是0到16777215,2的24次方【存储大小为 3 个字节大小】

INT(integer):有符号的范围是-2147483648至2147483647,无符号的范围是0到4294967295,2的32次方【存储大小为 4 个字节大小】

BIGINT:有符号的范围是-9223372036854775808至9223372036854775807,无符号的范围是0到18446744073709551615,2的64次方【存储大小为 8 个字节大小】


char(0~255)  varchar(0~65535)中:不管汉字还是数字或者是字母都算是一个字符(空格也算)。一个汉字字符用utf8占用3字节大小,用gbk占用2字节大小。一般情况下,char会造成空间浪费,但是有速度优势;而varchar节省了空间,但是速度就不如char。

char:尾部有空格会被截断,所以查询出来的结果最好trim一下

varchar:尾部有空格不会截断


http://zhumeng8337797.blog.163.com/blog/static/10076891420115155956214/

http://www.blogguy.cn/archives/?article-809.html








MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。

概 述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。由MySQL支持的列类型列在下面。下列代码字母用于描述 中:M指出最大的显示尺寸。最大的合法的显示尺寸是 255  。D适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。方括号(“[”和“]”)指出可选的类型修饰 符的部分。注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]

一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

这是INT的一个同义词。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到

18446744073709551615。 注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,因此你不应该使用大于9223372036854775807(63位)的有符号大整 数,除了位函数!注意,当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数),如 果结果大于9223372036854775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数,其精度可以 是<=24,对一个双精度浮点数,是在25  和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数 位数是未定义的。在MySQL3.23中,这是一个真正的浮点值。在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为 了ODBC兼容性而提供。

FLOAT[(M,D)] [ZEROFILL]

一个小(单精密)浮点数字。不能无符号。允许的值 是-3.402823466E+38到-1.175494351E-38,0  和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24  的一个参数表示一个单精密浮点数字。

DOUBLE[(M,D)] [ZEROFILL]

一个正常大小(双精密)浮点数字。不 能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、  0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的  DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。

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

REAL[(M,D)] [ZEROFILL]

这些是DOUBLE同义词。

DECIMAL[(M[,D])] [ZEROFILL]

一 个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数 点,并且对于负数,“-”符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的  DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。注意,在MySQL3.22  里,M参数包括符号和小数点。

NUMERIC(M,D) [ZEROFILL]

这是DECIMAL的一个同义词。

DATE

一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。

DATETIME

一 个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31  23:59:59'。MySQL以'YYYY-MM-DD  HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。

TIMESTAMP[(M)]

一 个时间戳记。范围是'1970-01-01  00:00:00'到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD  格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个  TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时 间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。

TIME

一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。

YEAR[(2|4)]

一 个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069(  70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类 型。)

CHAR(M) [BINARY]

一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~  255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL  CHAR(短形式NCHAR)是ANSI  SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。

[NATIONAL] VARCHAR(M) [BINARY]

一 个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。  VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。 VARCHAR是CHARACTER  VARYING一个缩写。

TINYBLOB

TINYTEXT

一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。

BLOB

TEXT

一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。

MEDIUMBLOB

MEDIUMTEXT

一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。

LONGBLOB

LONGTEXT

一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。

ENUM('value1','value2',...)

枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。

SET('value1','value2',...)

一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。

1 INT(M), M是管什么用的?
      作为对 ANSI/ISO SQL92 标准的一个扩展,MySQL 也支持上面的表格所列出的整型类型 TINYINT、MEDIUMINT 和  BIGINT。另外一个扩展是 MySQL 支持随意指定一个整型数值的显示格式,这通过在类型的基本关键词后跟一个括号来实现(例如  INT(4))。这个可选的宽度规格说明是用于在数值显示时,对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也  不是为了限制那些超过该列指定宽度的值的可被显示的数字位数。当与可选的扩展属性 ZEROFILL  一起使用时,缺省填补用的空格被零代替。举例来说,一个列被定义为 INT(5) ZEROFILL,插入的值 4 被检索出来时为  00004。注意,如果在一个整型列中存储一个超过显示宽度的更大值时,当 MySQL  为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,MySQL 信任地认为所有的值均适合原始的列宽度。

       这个可选的宽度规格说明是用于在数值显示时,对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也  不是为了限制那些超过该列指定宽度的值的可被显示的数字位数。注意,如果在一个整型列中存储一个超过显示宽度的更大值时,当mysql为某些复杂的联结 (join)生成临时表时,你可能会遇到问题,因为在这种情况下,mysql信任地认为所有的值均适合原始的列宽度。

      而int本身就是4个字节 bigint是8个字节 所以说int(X)的含义就是 int决定数据存储的字节 X表示期望数据的列宽度

    在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度。

     这个代表显示宽度
     整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。

     int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001  ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0


MySQL字符串列类型区分

1.

首先CHAR, VARCHAR, TEXT和BINARY, VARBINARY, BLOB的区别:

CHAR, VARCHAR, TEXT称为非二进制字符串;

BINARY, VARBINARY, BLOB称为二进制字符串;

二进制字符串和非二进制字符串的区别是:
二进制字符串包含的是字节字符串,非二进制字符串包含的是字符字符串;

后者可以定义字符集,前者不可以;

而且排序和比较前者基于列值字节的数值值,后者则根据字母顺序进行排序或比较;

BINARY类似与CHAR类型,但是保存二进制字符串而不是非二进制字符串;

VARBINARY类似与VARCHAR类型,但是保存二进制字符串而不是非二进制字符串;
同样类似的BLOB对应TEXT类型(相应的有TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB和TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT)

2.

CHAR和VARCHAR相同之处:

都可以定义字符串的长度,如CHAR(M), VARCHAR(M);

不同之处:

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR(M) 定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。 VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。


注意:MySQL  数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在  MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字   节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文  件的大小。


CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)

如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

由于BINARY和VARBINARY分别与CHAR和VARCHAR对应,因此两者的区别也和CHAR和VARCHAR的区别类似。

但是注意VARBINARY定义的M值范围为0<=M<=255

3. VARCHAR和TEXT类型的区别:

TEXT类型不需要指定M值,其他方面与VARCHAR都类似:比如存储的是可变长度,即不够的部分不需要右边空格填充;等等。

TEXT与VARCHAR类似,实际需要保存字符串本身外加两个字节保存字符串的实际长度。

看下表容易理解上面讲述的区别:

字符串类型的存储需求(M为最大长度,L实际存储字符串的长度)

列类型
存储需求

CHAR(M)
M个字节,0 <= M <= 255 (L为固定的=255,不够补空格)

VARCHAR(M)
L+1个字节,其中L <= M 且0 <= M <= 65535(参见下面的注释)(MySQL5.0之前都是最大255)

BINARY(M)
M个字节,0 <= M <= 255

VARBINARY(M)
L+1个字节,其中L <= M 且0 <= M <= 255

TINYBLOB, TINYTEXT
L+1个字节,其中L < 28 (256)

BLOB, TEXT
L+2个字节,其中L < 216 (65536)

MEDIUMBLOB, MEDIUMTEXT
L+3个字节,其中L < 224

LONGBLOB, LONGTEXT
L+4个字节,其中L < 232

ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)

SET('value1','value2',...)
1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员)


解释:

CHAR(M)为固定长度,而且M必须要在0~255之间;

VARCHAR(M)保存可变长度,M定义了最大长度,M取值0~65535之间;

TINYTEXT不需要定义长度M值,长度范围不超过28 (256);

TEXT不需要定义长度M值,长度范围不超过216 (65536);

下面类似。。。

对于二进制字符串形式:BINARY(M),VARBINARY(M),TINYBLOB,BLOB等类似。

更详细的参考:

http://dev.mysql.com/doc/refman/5.1/zh/column-types.html

4.

其他一些参考信息:

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

2、 VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为  VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3.NCHAR、NVARCHAR、 NTEXT。这三种从名字上看比前面三种  多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文   与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个  字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储  4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar  数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar



注意:

使用整数数据的精确数字数据类型。
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为  8 个字节。
int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为  4 个字节。int 的 SQL-92 同义字为 integer。
smallint
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为  2 个字节。
tinyint
从 0 到 255 的整型数据。存储大小为  1 字节。
注释
在支持整数值的地方支持 bigint 数据类型。但是,bigint 用于某些特殊的情况,当整数值超过 int 数据类型支持的范围时,就可以采用 bigint。在 SQL Server 中,int 数据类型是主要的整数数据类型。
在数据类型优先次序表中,bigint 位于 smallmoney 和 int 之间。
只有当参数表达式是 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自动将其它整数数据类型(tinyint、smallint 和 int)提升为 bigint。


哎,别好高骛远了!走都还是磕磕绊绊,就像学人家飞,回过头发现自己基础很薄弱,基础一定要打牢啊!!!!






      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/965788,如需转载请自行联系原作者





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 JSON 关系型数据库
一文搞懂MySQL表字段类型长度的含义
一文搞懂MySQL表字段类型长度的含义
35 0
|
3月前
|
关系型数据库 MySQL 数据库
mysql数据库 字段类型 varchar 值为数字,取最大值时出现的问题
mysql数据库 字段类型 varchar 值为数字,取最大值时出现的问题
|
7月前
|
关系型数据库 MySQL 数据库
MySQL中Where字段类型不一致能用到索引吗?
MySQL中Where字段类型不一致能用到索引吗?
70 0
|
9月前
|
存储 SQL 关系型数据库
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
132 0
|
9月前
|
存储 关系型数据库 MySQL
MySQL中字段类型存储需要多少字节
MySQL中字段类型存储需要多少字节
46 0
|
10月前
|
存储 SQL Java
MySQL中的字段类型对应于Java对象中的数据类型
还在纠结javaType和jdbcType?MySQL数据类型对应Java什么类型?JdbcType类型和Java对象有什么对应关系?数据库类型的Integer是对应int还是对应Integer?本文带你一探究竟!
221 0
MySQL中的字段类型对应于Java对象中的数据类型
|
存储 关系型数据库 MySQL
Mysql的数据类型和字段类型详解
Mysql的数据类型和字段类型详解
147 0
Mysql的数据类型和字段类型详解
|
存储 机器学习/深度学习 JSON
一文搞懂MySQL表字段类型长度的含义
一文搞懂MySQL表字段类型长度的含义
|
SQL 关系型数据库 MySQL
MySQL中BETWEEN AND(范围查询)
MySQL 提供了 BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。最近使用between and 去查询数据,但是在时间的临界点有一些问题,所以记录一下。
728 0
MySQL中BETWEEN AND(范围查询)
|
存储 JSON 算法
MySQL笔记 | 4.MySQL数据库设计-字段类型
在业务需求研发工作中,根据产品来进行设计表是必须的,但是我们可能对字段类型常常认识模拟两可,知道时间类型使用TIMESTAMP和DATETIME,但是却不知道TIMESTAMP的上限快到了,到时候需要涉及表字段的修改,下面通过梳理一些字段类型的坑,让我们在涉及表中,更清楚知道为什么要用这个字段类型,他的好处是什么。