分析MySQL数据类型的长度
一文搞懂MySQL的数据类型中长度的含义
⼀⽂搞懂MySQL的数据类型中长度的含义我们在数据库建表时,经常会困扰某个字段应该选择什么数据类型,以及填写什么长度。
选择数据类型⽅⾯⼀般不会有什么⼤问题,但是在填写对应的长度的时候,很多⼈就会困扰,对应长度填写的数字到底是什么含义,以及会影响到哪些东西。
笔者在翻阅⽹上的相关⽂章时,发现⼀⼤半⽂章写的都是错的,主要的问题在于搞混了“字符”和“字节”这两者的含义,甚⾄有的⼈觉得这就是⼀回事。
如果对字符和字节不理解的读者,可以先阅读《⼀⽂搞懂字符和字节的含义》。
本⽂我们通过实例来介绍MySQL的数据类型中长度的含义,读完本⽂能够让你在数据库建表的时候不再困惑。
字符串类型常⽤的字符串类型的数据类型有 CHAR 和 VARCHAR 两种,两者后⾯都需要跟上⼀个数字表⽰长度,例如CHAR(10)VARCHAR(10)CHAR(n) 和 VARCHAR(n) 两者中的 n 含义均为该字段最⼤可容纳的字符数。
(注意早期的版本中,n指的是字节数,你也不需要关注是哪些版本,因为是⼗多年前的版本了,估计⼀般⼈也⽤不到)。
占⽤空间CHAR(n) 和 VARCHAR(n) 字段值的占⽤空间不是固定的,⽽是由实际存⼊的内容决定的,但在细节上两者有⼀些不同。
我们均以 n=4 为例。
对于 CHAR(4) 表⽰固定容纳4个字符,当少于4个字符时,会使⽤空格填充空缺的部分,使其达到4个字符。
如果超过4个字符,会⾃动截断超出部分。
例如你存⼊数据为 'ab' ,实际会存⼊ 'ab ' (ab后有2个空格),因此占⽤4个字节。
以下以⼏个案例作为演⽰:'a啊b' —— 字符数为3,少1个⽤空格补齐,因此实际存⼊ 'a啊b ' ,字符数:4,字节数:1+3+1+1=6'a啊b哈ccccccccc' —— 字符数超出4,仅保留前4个字符,因此实际存⼊ 'a啊b哈' ,字符数:4,字节数:1+3+1+3=8'a啊和哈' —— 字符数刚好为4,不需要截断和补齐,因此实际存⼊ 'a啊和哈' ,字符数:4,字节数:1+3+3+3=10对于 CHAR 字段,你在使⽤ CHAR_LENGTH() 和 LENGTH() 函数查询时,会发现和以上描述的情况不⼀致,我们放上代码演⽰:(备注: CHAR_LENGTH() 函数返回字符串的字符数, LENGTH() 函数返回字符串的字节数)-- 假定已存在表 tb ,其中包含字段 s_char 的数据类型定义为 CHAR(4) ,我们先进⾏插⼊操作,获取插⼊⾏id=1INSERT INTO `tb`(`s_char`) VALUES ('啊a');-- 接下去查询该⾏ SELECT s_char, CHAR_LENGTH(s_char), LENGTH(s_char) FROM `tb` WHERE id=1;-- 结果为:s_char=>'啊a',CHAR_LENGTH(s_char)=>2,LENGTH(s_char)=>4你会发现以上结果跟预想中的不⼀致,按照⼀般理解预期存⼊ '啊a' ,仅为2个字符,需补充2个空格,实际存⼊为 '啊a ' ,因此字符数为4,字节数为 3+1+1+1=6 。
MySQL数据库varchar的限制规则说明
MySQL数据库varchar的限制规则说明数据库中最⼤长度是多少?其实这不是⼀个固定的数字,varchar的长度是有的。
本⽂我们就来介绍⼀下MySQL数据库中varchar的限制规则,并以⼀个实际的例⼦对限制规则进⾏了说明,接下来就让我们⼀起来了解⼀下这部分内容。
字段的限制在字段定义的时候有以下规则:varchar字段是将实际内容单独存储在聚簇索引之外,内容开头⽤1到2个字节表⽰实际长度(长度超过255时需要2个字节),因此最⼤长度不能超过65535。
字符类型若为gbk,每个字符最多占2个字节,最⼤长度不能超过32766;字符类型若为utf8,每个字符最多占3个字节,最⼤长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强⾏转为text类型,并产⽣warning。
导致实际应⽤中varchar长度限制的是⼀个⾏定义的长度。
MySQL要求⼀个⾏的定义长度不能超过65535。
若定义的表长度超过这个值,则提⽰ERROR1118(42000):Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.YouhavetochangesomecolumnstoTEXTorBLOBs。
举两个例说明⼀下实际长度的计算。
a)若⼀个表只有⼀个varchar类型,如定义为createtablet4(cvarchar(N))charset=gbk;则此处N的最⼤值为(65535-1-2)/2=32766。
减1的原因是实际⾏存储从第⼆个字节开始';减2的原因是varchar头部的2个字节表⽰长度;除2的原因是字符编码是gbk。
b)若⼀个表定义为createtablet4(cint,c2char(30),c3varchar(N))charset=utf8;则此处N的最⼤值为(65535-1-2-4-30*3)/3=21812。
MYSQL数据类型——字符串类型
MYSQL数据类型——字符串类型⼀、字符串类型在SQL中,将字符串类型分成了6类:char,varchar,text,blob,enum和set。
1.1 定长字符串定义:char,磁盘(⼆维表)在定义结构的时候,就以及确定了最终数据的存储长度。
Char(L): L代表length,可以存储的长度,单位为字符,最⼤长度值可以为255.Char(4):在UTF8环境下,需要4*3=12个字节。
1.2 变长字符串定义:varchar,在分配空间的时候,按照最⼤的空间分配,但是实际上最终⽤了多少,是根据具体的数据来确定。
Varchar(L): L表⽰字符长度,理论长度是65536个字符,但是会多出1到2个字节来确定存储的实际长度Varchar(10): 的确存了10个汉字,UTF8环境,10*3+1=31存储了3个汉字,UTF8环境,3*3+1=10(bytes)定长与变长的存储实际空间(UTF8)存储实际空间Char(4)Varchar(4)Char占⽤字节Varchar占⽤字节ABCD ABCD ABCD4*3=124*3+1=13A A A4*3=121*3+1=4ABCDE××数据超过长度数据超过长度如何选择定长或者是变长字符串呢?定长的磁盘空间⽐较浪费,但是效率⾼:如果数据基本上确定长度都⼀样,就是使⽤定长,如:⾝份证,电话号码,⼿机号码等变长的磁盘空间⽐较节省,但是效率低:如果数据不能确定长度(不同数据有变化),如姓名、地址等。
1.3 ⽂本字符串如果数据量⾮常⼤,通常说超过255个字符就会使⽤⽂本字符串⽂本字符串根据存储的格式进⾏分类:text和blobText: 存储⽂字(⼆进制数据实际上都是存储路径)Blob: 存储⼆进制数据(通常不⽤)1.4 枚举字符串枚举定义:enum,事先将所有可能出现的结果都设计好,实际上存储的数据都必须是规定好的数据中的⼀个。
枚举的使⽤⽅式定义:enum(可能出现的元素列表); //如 enum(‘男’,‘⼥’,‘不男不⼥’,‘妖’,‘保密’);使⽤:存储数据,只能存储上⾯定义好的数据(a) 创建枚举表1CREATE TABLE my_enum(gender enum('男','⼥','保密')) charset utf8;(b)加⼊数据作⽤之⼀:规范数据格式;数据只能是规定的数据的其中⼀个1insert into my_enum values('男'),('保密'); --有效数据2insert into my_enum values('male'); --错误数据(没有male元素)(b)作⽤之⼆:节省存储空间(枚举通常有⼀个别名:单选框):枚举实际存储的是数值⽽不是字符串本⾝。
MySQL数据类型(最大值和最小值)
MySQL数据类型(最⼤值和最⼩值)MySQL数据类型(最⼤值和最⼩值)1、整型MySQL数据类型含义(有符号)tinyint(m)1个字节范围(-128~127)smallint(m)2个字节范围(-32768~32767)mediumint(m)3个字节范围(-8388608~8388607)int(m)4个字节范围(-2147483648~2147483647)bigint(m)8个字节范围(+-9.22*10的18次⽅)取值范围如果加了unsigned,则最⼤值翻倍,如tinyint unsigned的取值范围为(0~255)。
int(m)⾥的m是表⽰SELECT查询结果集中的显⽰宽度,不知道这个m有什么⽤。
int 占10位,存不了⼿机号(11位)2、浮点型(float和double) 浮点型在数据库中存放的是近似值MySQL数据类型含义float(m,d)单精度浮点型 8位精度(4字节) m总个数,d⼩数位double(m,d)双精度浮点型 16位精度(8字节) m总个数,d⼩数位设⼀个字段定义为float(5,3),如果插⼊⼀个数123.45678,实际数据库⾥存的是123.457,但总个数还以实际为准,即6位。
3、定点数定点类型在数据库中存放的是精确值浮点型在数据库中存放的是近似值,⽽定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是⼩数位。
4、字符串(char,varchar,_text)MySQL数据类型含义char(n)固定长度,最多255个字符varchar(n)可变长度,最多65535个字节tinytext可变长度,最多255个字符text可变长度,最多65535个字符mediumtext可变长度,最多2的24次⽅-1个字符longtext可变长度,最多2的32次⽅-1个字符。
mysql float 长度与小数点 建表
MySQL是一种非常流行的关系型数据库系统,在数据处理时,需要使用到许多MySQL的数据类型,其中float类型就是其中之一。
在MySQL中,float类型可以用来存储浮点数,而且float类型的区别主要在于长度和小数点位数的不同。
因此,在使用MySQL时,我们需要了解MySQL float长度和小数点建表的相关知识。
在本文中,我们将详细介绍MySQL float长度和小数点建表的方法。
一、MySQL float类型的长度在MySQL中,float类型与double类型一样,都用于存储浮点数。
float类型允许存储的浮点数的长度可以是4个或8个字节,这一点与double类型不同,double类型的长度始终为8个字节。
在创建MySQL float类型的列时,可以指定其长度,即指定存储的字节数。
例如,可以使用FLOAT(4)来指定浮点数的存储长度为4字节。
需要注意的是,这里的长度指定的是存储的字节长度,而不是指定可以存储的数值范围。
在MySQL中,float类型默认的长度为4个字节,如果指定的长度超出了默认值,MySQL将自动把它调整为默认的长度。
如果想要存储更大的浮点数,可以使用double类型,其长度为8个字节。
在MySQL中,可以使用以下的表示方法来指定不同长度的float类型:1、FLOAT(M):在MySQL中,M表示数字的最大总位数,而不是小数点前的整数位数。
对于float类型,M也可以是1到24之间的任意值。
但需要注意的是,这个数字只是在显示时有效。
在实际存储中,float类型4个字节并不会变长。
2、FLOAT(M,D):在MySQL中,D表示小数点后的位数,M-D表示小数点前的位数。
对于float类型,M也可以是1到24之间的任意值,D则是0到M之间的任意值。
需要注意的是,当没有指定D时,MySQL默认D值为0。
例如,可以使用以下命令来创建一个FLOAT类型的列:CREATE TABLE table_name(column_name FLOAT(10,2));这将创建一个名为column_name的列,它的存储长度为4个字节(默认值),小数点后包含2位,可以存储最大的数字总位数为10位的浮点数。
mysql中整数类型后面的数字,比如int(11),11代表11个字节吗?
mysql中整数类型后⾯的数字,⽐如int(11),11代表11个字节吗?原先对mysql不太理解,但也没有报错。
但理解的不够深⼊。
这次补上。
原来以为int(11)是指11个字节,int(10)就是10个字节。
我错了。
mysql的基本数据类型⾥⼏个int如下:类型⼤⼩范围(有符号)范围(⽆符号)⽤途TINYINT 1字节 (-128,127) (0,255) ⼩整数值SMALLINT 2 字节 ( -2^15 :-32 768,2^15 - 1:32 767) (0,65 535) ⼤整数值MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) ⼤整数值INT或INTEGER(int 的 SQL-92 同义字为 integer) 4 字节 (-2^31:-2 147 483 648, 2^31 - 1:2 147 483 647) (0,4 294 967 295) ⼤整数值BIGINT 8 字节 (-2^63:-9 233 372 036 854 775 808,2^63-1:9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极⼤整数值这些类型,是定长的,其容量是不会随着后⾯的数字⽽变化的,⽐如int(11)和int(8),都是⼀样的占4字节。
tinyint(1)和tinyint(10)也都占⽤⼀个字节。
那么后⾯的11和8,有啥⽤呢。
mysql数据库中以:数据类型(m) 来约束数据,其中数字m在不同的数据类型中表⽰含义是不同的。
咱们这⾥只讲整数。
整型数系统已经限制了取值范围,tinyint占1个字节、int占4个字节。
所以整型数后⾯的m不是表⽰的数据长度,⽽是表⽰数据在显⽰时显⽰的最⼩长度。
tinyint(1) 这⾥的1表⽰的是最短显⽰⼀个字符。
tinyint(2) 这⾥的2表⽰的是最短显⽰两个字符。
mysql int范围与最大值分析
mysql int范围与最大值分析在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度。
这个代表显示宽度整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。
int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。
显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
Be careful when considering ENUM('T','F') as "true binary".Example:CREATE TABLE `bits` (`val` ENUM('T','F') NOT NULL);mysql> INSERT INTO `bits` (`val`) VALUES ('W'), ('T'), ('F');Query OK, 3 rows affected, 1 warning (0.00 sec)Records: 3 Duplicates: 0 Warnings: 1mysql> SHOW WARNINGS;+---------+------+------------------------------------------+| Level | Code |Message |+---------+------+------------------------------------------+| Warning | 1265 | Data truncated for column 'val' at row 1|+---------+------+------------------------------------------+1 row in set (0.00 sec)mysql> SELECT COUNT(DISTINCT val) FROM bits;+---------------------+| COUNT(DISTINCT val) |+---------------------+| 3|+---------------------+1 row in set (0.00 sec)Well, shouldn't a binary type have only two distinct values?(Note that it isn't NULL.)Explanation from manual (10.4.4. The ENUM Type):-----If you insert an invalid value into an ENUM (that is, a string not present in the list of permitted values), the empty string is inserted instead as a special error value. This string can bedistinguished from a “normal” empty string by the fact that this string has the numeric value 0.More about this later。
mysql各数据类型的大小及长度
mysql各数据类型的⼤⼩及长度数字型类型⼤⼩范围(有符号)范围(⽆符号)⽤途TINYINT 1 字节(-128,127)(0,255)⼩整数值SMALLINT 2 字节(-32 768,32 767)(0,65 535)⼤整数值MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)⼤整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)⼤整数值BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372036 854 775 807)(0,18 446 744 073 709 551 615)极⼤整数值FLOAT 4 字节(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466E+38)单精度浮点数值DOUBLE8 字节(1.797 693 134 862 315 7 E+308,2.225073 858 507 201 4 E-308),0,(2.225073 858 507 201 4 E-308,1.797 693134 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的值⼩数值字符类型CHAR0-255字节定长字符串VARCHAR0-255字节变长字符串TINYBLOB0-255字节不超过 255 个字符的⼆进制字符串TINYTEXT0-255字节短⽂本字符串BLOB0-65 535字节⼆进制形式的长⽂本数据TEXT0-65 535字节长⽂本数据MEDIUMBLOB0-16 777 215字节⼆进制形式的中等长度⽂本数据MEDIUMTEXT0-16 777 215字节中等长度⽂本数据LOGNGBLOB0-4 294 967 295字节⼆进制形式的极⼤⽂本数据LONGTEXT0-4 294 967 295字节极⼤⽂本数据枚举集合类型⼤⼩(字节)最多成员数ENUM6465535SET6464时间类型类型⼤⼩(字节)范围格式⽤途DATE31000-01-01/9999-12-31YYYY-MM-DD⽇期值TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合⽇期和时间值TIMESTAMP81970-01-01 00:00:00/2037 年某时YYYYMMDD HHMMSS混合⽇期和时间值,时间戳。
MySQL中char、varchar和nvarchar的区别
MySQL中char、varchar和nvarchar的区别⼀、char和varchar的区别char是固定长度的,⽽varchar会根据具体的长度来使⽤存储空间,另外varchar需要⽤额外的1-2个字节存储字符串长度。
1). 当字符串长度⼩于255时,⽤额外的1个字节来记录长度2). 当字符串长度⼤于255时,⽤额外的2个字节来记录长度⽐如char(255)和varchar(255),在存储字符串"hello world"时,char会⽤⼀块255个字节的空间放那个11个字符;⽽varchar就不会⽤255个,它先计算字符串长度为11,然后再加上⼀个记录字符串长度的字节,⼀共⽤12个字节存储,这样varchar在存储不确定长度的字符串时会⼤⼤减少存储空间。
⼆、varchar和nvarchar的区别1. varchar(n):长度为n个字节的可变长度且⾮Unicode的字符数据。
n必须是⼀个介于1和8,000之间的数值。
存储⼤⼩为输⼊数据的字节的实际长度2. nvarchar(n):包含n个字符的可变长度Unicode字符数据。
n的值必须介于1与4,000之间。
字节的存储⼤⼩是所输⼊字符个数的两倍。
所输⼊的数据字符长度可以为零。
三、char和varchar的使⽤场景1. 从字符长度的⾓度考虑:(1). 长度较短的字段,使⽤char。
如门牌号:101,201,...(2). 固定长度的字段,使⽤char。
如性别、⾝份证号、⼿机号等。
(因为数据都是固定长度,varchar根据长度动态存储的特性就没作⽤了,⽽且还要占⼀个字节来存储长度)(3). 字段的长度是否相近,如果某个字段其长度虽然⽐较长,但是其长度总是近似的,如⼀般在90个到100个字符之间,甚⾄是相同的长度。
此时⽐较适合采⽤CHAR字符类型。
2. 从碎⽚⾓度考虑:使⽤CHAR时,由于存储空间都是⼀次性分配的。
从这个⾓度来讲,不存在碎⽚的困扰。
mysql基本数据类型
mysql基本数据类型MySQL是一种关系型数据库管理系统,它支持多种数据类型。
MySQL的数据类型分为数值类型、日期和时间类型、字符串类型、二进制类型。
以下是MySQL基本数据类型(注意:各类型数据的存储要占用的字节数,不同的数据库系统、不同的编译选项这些大小限制和取值范围有所不同):1. 数值类型MySQL数值类型有整数类型和小数类型两种:1.1 整数类型- TINYINT:有符号范围为-128~127,无符号范围0~255。
占用1个字节。
- SMALLINT:有符号范围为-32768~32767,无符号范围0~65535。
占用2个字节。
- MEDIUMINT:有符号范围为-8388608~8388607,无符号范围0~16777215。
占用3个字节。
- INT:有符号范围为-2147483648~2147483647,无符号范围0~4294967295。
占用4个字节。
- BIGINT:有符号范围为-9223372036854775808~9223372036854775807,无符号范围0~18446744073709551615。
占用8个字节。
1.2 小数类型- FLOAT:单精度浮点数,占用4个字节。
- DOUBLE:双精度浮点数,占用8个字节。
- DECIMAL:高精度浮点数,依赖于实际存储的数字大小而变化。
2. 日期和时间类型MySQL日期和时间类型包括DATE、TIME、DATETIME、YEAR和TIMESTAMP:- DATE:日期,存储的范围为'1000-01-01'到'9999-12-31'。
占用3个字节。
- TIME:时间,存储的范围为 '-838:59:59'到 '838:59:59'。
占用3个字节。
- DATETIME:日期时间,存储范围为 '1000-01-01 00:00:00'到 '9999-12-31 23:59:59'。
mysql查询表的数据大小
mysql查询表的数据⼤⼩在需要备份数据库⾥⾯的数据时,我们需要知道数据库占⽤了多少磁盘⼤⼩,可以通过⼀些sql语句查询到整个数据库的容量,也可以单独查看表所占容量。
1、要查询表所占的容量,就是把表的数据和索引加起来就可以了select sum(DATA_LENGTH)+sum(INDEX_LENGTH) from information_schema.tableswhere table_schema='数据库名'; 上⾯获取的结果是以字节为单位的,可以通过%1024在%1024的到M为单位的结果。
2、查询所有的数据⼤⼩select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables; -- 查询所有的数据⼤⼩ 3、查询某个表的数据select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema=’数据库名’ AND table_name=’表名’;在mysql中有⼀个information_schema数据库,这个数据库中装的是mysql的元数据,包括数据库信息、数据库中表的信息等。
所以要想查询数据库占⽤磁盘的空间⼤⼩可以通 过对information_schema数据库进⾏操作。
information_schema中的表主要有: schemata表:这个表⾥⾯主要是存储在mysql中的所有的数据库的信息 tables表:这个表⾥存储了所有数据库中的表的信息,包括每个表有多少个列等信息。
columns表:这个表存储了所有表中的表字段信息。
statistics表:存储了表中索引的信息。
user_privileges表:存储了⽤户的权限信息。
schema_privileges表:存储了数据库权限。
聊聊mysql中的int(1)
聊聊mysql中的int(1)昨天有个读者问了我这样⼀个问题在mysql中建表的时候,我设置⼀个字段为int类型,长度为1,但是我发现这个字段却可以存储任意长度的数字,这是什么情况?这个问题在我刚接触数据库的时候也遇到过,我觉得有必要写⼀篇⽂章来解释⼀下。
0和1是计算机最基本的存储单位。
也是CPU采⽤的最基本的计算单位,也就是⼆进制。
int类型占4个字节,⼀个字节是8位,也就是说int类型在计算机底层是由32个0跟1表⽰,转化为⼗进制就是2的32次⽅,那么存储范围就是0~2^32 ,如果带符号位的话就是-2^31 ~ 2^31-1。
在使⽤SQLyog⼯具建表时,除了常见的⼏个属性Field Name,DataType,Len,Default,PK?,Not Null?,Auto Incr?,Comment之外,还有两个不常⽤的Unsigned?和Zerofill?,这两个属性到底有什么⽤呢?Unsigned:⽆符号的,意思就是只能为正数,不能为负数。
Zerofill:零填充,意思就是达不到指定长度后,前⾯⽤0来填充。
现在再来看看这个int(1)中的1究竟有什么奥秘。
这个1跟这个字段能存的数据范围没关系,它也不是限制这个字段的数据长度的。
这个字段存储的数据范围是由int来限制的。
这个1只是规定了数据的宽度,如果你选择了Zerofill属性,就能更好地理解这个1了,如果我们写⼊的数据达不到这个长度,那么就会在数据前⾯补0来达到这个长度。
⽐如我们将int(1)改成int(3),我们再输⼊1,实际上显⽰的是001。
所以不管你将int类型的长度设为多少并不会影响数据的存储范围。
mysql对于整型的数据类型,不仅给我们提供了int,还提供了tinyint,smallint,mediumint和bigint。
这些类型存储的数据范围都是不⼀样的,具体如下表:类型字节最⼩值最⼤值(带符号的/⽆符号的)(带符号的/⽆符号的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-214748364821474836470429*******BIGINT8-92233720368547758089223372036854775807018446744073709551615看到这⼉,应该已经清楚int(1)的真正含义了。
Mysql字段数据类型长度及表类型详细说明
mysql字段数据类型、长度及表类型说明一、MySQL 字段数据类型/长度1、数值类型列类型需要的存储量TINYINT 1 字节SMALLINT 2 个字节MEDIUMINT 3 个字节INT 4 个字节INTEGER 4 个字节BIGINT 8 个字节FLOAT(X) 4 如果X < = 24 或8 如果25 < = X < = 53FLOAT 4 个字节DOUBLE 8 个字节DOUBLE PRECISION 8 个字节REAL 8 个字节DECIMAL(M,D) M字节(D+2 , 如果M < D)NUMERIC(M,D) M字节(D+2 , 如果M < D)MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。
许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。
INT 类型在MySQL 中支持的5 个主要整数类型是TINYINT,SMALLINT,MEDIUMINT,INT 和BIGINT。
这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。
MySQL 以一个可选的显示宽度指示器的形式对SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。
例如,指定一个字段的类型为INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。
需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。
万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。
还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为0。
UNSIGNED(未签署)修饰符规定字段只保存正值。
因为不需要保存数字的正、负符号,可以在储时节约一个“位”的空间。
MySQL中的数据类型的长度范围和显示宽度(转)
MySQL中的数据类型的长度范围和显⽰宽度(转)长度范围是随数据类型就已经是固定的值,⽽显⽰宽度与长度范围⽆关。
以下是每个整数类型的存储和范围(来⾃MySQL⼿册)类型字节最⼩值最⼤值(带符号的/⽆符号的)(带符号的/⽆符号的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-214748364821474836470429*******BIGINT8-92233720368547758089223372036854775807018446744073709551615表格⼀共有四列分别表式:字段类型,占⽤字节数,允许存储的最⼩值,允许存储的最⼤值。
我们拿int类型为例:int类型,占⽤字节数为4byte,学过计算机原理的同学应该知道,字节(byte)并⾮是计算机存储的最⼩单位,还有⽐字节(byte)更⼩的单位,也就是位(bit),⼀个位就代表⼀个0或1; 8个位组成⼀个字节;⼀般字节⽤⼤写B来表⽰byte,位⽤⼩写b来表⽰bit。
计算机存储单位的换算:1B=8b1KB=1024B1MB=1024KB那么根据int类型允许存储的字节数是4个字节,我们就能换算出int UNSIGNED(⽆符号)类型的能存储的最⼩值为0,最⼤值为4294967295(即4B=32b,最⼤值即为32个1组成);接下来我们再说说我们建表时的字段长度到底是怎么⼀回事。
CREATE TABLE `test` (`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,`number` INT(5) NOT NULL) ENGINE = MYISAM;以test表的number字段为例,⼤家看到我建的是int(5)MySQL⼿册中这个长度/值⽤"M"来表⽰的。
MySQL中的数据类型以及存储空间占用
MySQL中的数据类型以及存储空间占用MySQL是一种广泛使用的关系型数据库管理系统,被众多网站和应用程序所采用。
在MySQL中,数据类型决定了每个字段可以存储哪种类型的数据。
不同的数据类型在存储空间占用和数据的存储方式上有所区别。
本文将探讨MySQL中常见的数据类型以及它们在存储空间方面的差异。
1. 数值类型1.1 整型整数类型是MySQL中最常用的数据类型之一。
MySQL提供了多种整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,它们分别用于存储不同范围的整数。
这些整数类型在存储空间方面的差异如下:- TINYINT:占用1个字节(8位),可存储范围为-128到127或者0到255。
- SMALLINT:占用2个字节(16位),可存储范围为-32768到32767或者0到65535。
- MEDIUMINT:占用3个字节(24位),可存储范围为-8388608到8388607或者0到16777215。
- INT:占用4个字节(32位),可存储范围为-2147483648到2147483647或者0到4294967295。
- BIGINT:占用8个字节(64位),可存储范围为-9223372036854775808到9223372036854775807或者0到18446744073709551615。
根据存储需求和数据范围,选择合适的整数类型有助于提高性能和节约存储空间。
1.2 浮点型浮点类型用于存储小数。
MySQL提供了FLOAT和DOUBLE两种浮点类型。
它们在存储空间方面的差异如下:- FLOAT:占用4个字节(32位),可以存储大约7个有效数字。
- DOUBLE:占用8个字节(64位),可以存储大约15个有效数字。
FLOAT和DOUBLE类型适用于需要存储较大或较精确的浮点数的场景。
然而,由于浮点数的精度问题,对于需要精确计算的场景,应该使用十进制类型。
mysql数据类型
mysql 数据类型2009年07月18日星期六15:57在计算机中数据有两种特征:类型和长度。
所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
在SQL Server 中每个变量、参数、表达式等都有数据类型。
系统提供的数据类型分为几大类,。
其中,BIGINT、SQL_V ARIANT 和TABLE 是SQL Server 2000 中新增加的3 种数据类型。
下面分类讲述各种数据类型。
4.3.1 整数数据类型整数数据类型是最常用的数据类型之一。
1、INT (INTEGER)INT (或INTEGER)数据类型存储从-2的31次方(-2 ,147 ,483 ,648)到2的31次方-1 (2 ,147 ,483,647)之间的所有正负整数。
每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINTSMALLINT 数据类型存储从-2的15次方(-32,768)到2的15次方-1(32 ,767 )之间的所有正负整数。
每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3、TINYINTTINYINT数据类型存储从0 到255 之间的所有正整数。
每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINTBIGINT 数据类型存储从-2^63 (-9 ,223,372,036,854,775,807)到2^63-1(9,223,372,036 ,854 ,775,807)之间的所有正负整数。
每个BIGINT 类型的数据占用8个字节的存储空间。
4.3.2 浮点数据类型浮点数据类型用于存储十进制小数。
浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。
所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。
mysql的数据类型int、bigint、smallint和tinyint取值范围
mysql的数据类型int、bigint、smallint和tinyint取值范围
使⽤整数数据的精确数字数据类型。
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。
MySQL中的数据类型和数据长度选择指南
MySQL中的数据类型和数据长度选择指南引言在数据库设计和开发中,正确选择合适的数据类型和数据长度对于数据的存储和查询效率具有重要的影响。
MySQL作为一种流行的关系型数据库管理系统,提供了丰富的数据类型供开发者选择。
本文将介绍MySQL中常见的数据类型,并探讨如何选择恰当的数据长度来优化数据库性能。
一、整数类型1. TINYINTTINYINT类型用于存储小整数,范围为-128到127。
当存储不需要较大范围的整数时,选择TINYINT类型可以节省存储空间。
2. SMALLINTSMALLINT类型适用于存储较大范围的整数,范围为-32768到32767。
当整数范围在TINYINT和INT之间时,可以选择SMALLINT类型。
3. INTINT类型是MySQL中最常用的整数类型,范围为-2147483648到2147483647。
除非特殊需求,一般情况下选用INT类型即可满足需求。
4. BIGINT当需要存储超过INT类型范围的整数时,可以选择BIGINT类型。
BIGINT类型的范围为-9223372036854775808到9223372036854775807。
需要注意的是,由于BIGINT类型占用更多的存储空间,因此在选择时需要权衡存储空间和性能。
二、浮点数类型1. FLOATFLOAT类型适用于存储单精度浮点数,可以存储小数点后6到7位有效数字。
当需要存储较大范围的小数时,可以选择FLOAT类型。
2. DOUBLEDOUBLE类型是MySQL中默认的浮点数类型,用于存储双精度浮点数。
DOUBLE类型可以存储小数点后15到16位有效数字。
在需要更高精度的计算场景中,可以选择DOUBLE类型。
三、字符串类型1. CHARCHAR类型用于存储固定长度的字符串,长度取决于指定的字符数。
选择CHAR类型时,需要注意该字段的实际使用情况,避免浪费存储空间。
2. VARCHARVARCHAR类型适用于存储可变长度的字符串,长度可以在1到65535之间指定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL有几种数据类型可以限制类型的"长度",有CHAR(Length)、VARCHAR(Length)、TINYINT(Length)、 SMALLINT(Length)、MEDIUMINT(Length)、INT(Length)、BIGINT(Length)、 FLOAT(Length, Decimals)、DOUBLE(Length, Decimals)和DECIMAL(Length, Decimals)。
然而,这些数据类型的长度,并不是都指数据的大小。
具体说就是:
(1)CHAR、VARCAHR的长度是指字符的长度,例如CHAR[3]则只能放字符串"123",如果插入数据"1234",则从高位截取,变为"123"。
VARCAHR同理。
(2)TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT的长度,其实和数据的大小无关!Length指的是显示宽度,举个例子:
1.mysql> create table test(id int(3) zerofill);
2.Query OK, 0 rows affected (0.09 sec)
3.
4.mysql> insert into test(id) values(1),(1234);
5.Query OK, 2 rows affected (0.06 sec)
6.Records: 2 Duplicates: 0 Warnings: 0
7.
8.mysql> select * from test;
9.+------+
10.| id |
11.+------+
12.| 001 |
13.| 1234 |
14.+------+
15.2 rows in set (0.00 sec)
可以看出,id的显示宽度为3,不足的左边补0,数据长度超过的则原样输出。
如果没有zerofill,则看不出显示宽度,没有前导零。
(3)FLOAT、DOUBLE和DECIMAL的长度指的是全部数位(包括小数点后面的),例如DECIMAL(4,1)指的是全部位数为4,小数点后1位,如果插入1234,则查询的数据是999.9。
过程如下
1.mysql> alter table test add realnum decimal(4,1);
2.Query OK, 2 rows affected (0.03 sec)
3.Records: 2 Duplicates: 0 Warnings: 0
4.
5.mysql> insert into test(id,realnum) values(2,1234);
6.Query OK, 1 row affected, 1 warning (0.05 sec)
7.
8.mysql> select * from test;
9.+------+---------+
10.| id | realnum |
11.+------+---------+
12.| 001 | NULL |
13.| 1234 | NULL |
14.| 002 | 999.9 |
15.+------+---------+
16.3 rows in set (0.02 sec) 附录常见MySQL数据类型(留作备忘)。