分析MySQL数据类型的长度

合集下载

一文搞懂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的限制规则说明

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数据类型——字符串类型

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数据类型(最⼤值和最⼩值)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 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代表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范围与最大值分析

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各数据类型的大小及长度

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混合⽇期和时间值,时间戳。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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数据类型(留作备忘)。

相关文档
最新文档