MySQL字段类型说明

参考:https://learn.blog.csdn.net/article/details/102503090         MySQL显示宽度与字段长度

           https://learn.blog.csdn.net/article/details/90675967           MySQL字段长度、取值范围、存储开销(5.6/5.7/8.x的主要类型,区分显示宽度/有无符号/定点浮点、不同时间类型)

上面的两篇文章写得都非常不错,很值得看

    MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。

    MyISAM存储引擎表中行的最大大小为65534字节。每个BLOB和TEXT列只占其中的5至9个字节。

一、数值类型

M(影响的只是显示长度,实际存储空间并没有变)

指出最大的显示尺寸。最大的合法的显示尺寸是 255

D

适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2

方括号(“[”和“]”)指出可选的类型修饰符的部分。

 

注意,如果你指定一个列为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。

 

TINYINT[(M)] [UNSIGNED] [ZEROFILL]                1个字节

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

 

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]           2个字节

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

 

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]         3个字节

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

 

INT[(M)] [UNSIGNED] [ZEROFILL]                       4个字节

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

 

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

这是INT的一个同义词。

 

BIGINT[(M)] [UNSIGNED] [ZEROFILL]               8个字节

一个大整数。有符号的范围是-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]                      4个字节  

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

 

DOUBLE[(M,D)] [ZEROFILL]                  8个字节

一个正常大小(双精密)浮点数字。不能无符号。允许的值是-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]          8个字节 

 

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的一个同义词。 使用NUMBERIC( 和DECIMAL )的存储需求与具体版本有关:使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。

 

二、日期和时间

DATE                               3个字节

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

 

DATETIME                          8个字节

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

 

TIMESTAMP[(M)]                         4个字节

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

 

TIME                                      3个字节

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

 

YEAR[(2|4)]                                  1个字节

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

 

三、字符串类型

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

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

 

[NATIONAL] VARCHAR(M) [BINARY]       L+1个字节,其中L < M且0 <= M <= 65535

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

VARCHAR列的有效最大长度为65,532字符。

NDBCLUSTE引擎只支持固定宽度的列。这说明MySQL簇中的表中的VARCHAR列的行为如同类型CHAR(不同的是每个记录仍然有一个额外的字节空间)。例如,在Cluster表中,声明为VARCHAR(100)的列中的每个记录存储时将占用101个字节,无论实际存储的记录中的字符串的的长度为多少。

 

TINYBLOB、TINYTEXT       L+2个字节,其中L < 2的8次方

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

 

BLOB、TEXT                L+2个字节,其中L < 2的16次方           

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

BLOB和TEXT类需要1、2、3或者4个字节来记录列值的长度,取决于该类的最大可能的长度。

在NDBCluster存储引擎中,TEXT和blob列的实施是不同的,其中TEXT列中的每个记录由两个单独部分组成。一个是固定大小(256字节),并且实际上保存在原表中。中一个包括超出256字节的任何数据,保存在隐含的表中。第2个表中的记录部是2,000字节长。这说明如果size <= 256,TEXT列的大小为256(其中size表示记录的大小);否则,大小是256+size+(2000-(size-256)%2000)。

 

MEDIUMBLOB、MEDIUMTEXT             L+3个字节,其中L < 2的24次方

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

 

LONGBLOB、LONGTEXT                 L+4个字节,其中L < 2的32次方

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

 

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

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

ENUM对象的大小由不同的枚举值的数目确定。枚举用一个字节,可以有255个可能的值。当枚举的值位于255和65,535之间时,用两个字节。

 

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

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

    SET对象的大小由不同的set成员的数目确定。如果set大小是N,对象占(N+7)/ 8个字节。SET最多可以有60个成员。

 

 

注释:

1. VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串“abcd”,L是4,存储需要5个字节。

对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+1个字节。

要想计算用于保存具体CHAR、VARCHAR和TEXT列值的字节数,需要考虑该列使用的字符集。在具体情况中,当使用Unicode时,必须记住所有Unicode字符使用相同的字节数。

2. 使用来自其他数据库引擎的列类型

为了使用由其它专访编写的SQL执行代码,MySQL按照下表所示对列类型进行映射。通过这些映射,可以很容易地从其它数据库引擎将表定义导入的MySQL中:

其它第三方类型                     MySQL类型

BOOL                            TINYINT

BOOLEAN                        TINYINT

CHAR VARYING(M)                VARCHAR(M)

DEC                              DECIMAL

FIXED                            DECIMAL

FLOAT4                           FLOAT

FLOAT8                           DOUBLE

INT1                              TINYINT

INT2                              TINYINT

INT3                              MEDIUMINT

INT4                              INT

INT8                              BIGINT

LONG VARBINARY                 MEDIUMBLOB

LONG VARCHAR                   MEDIUMTEXT

LONG                             MEDIUMTEXT

MIDDLEINT                        MEDIUMINT

NUMERIC                          DECIMAL

在创建表时对列类型进行映射,然后原来的类型定义被丢弃。如果你使用其它卖方的类型创建一个表,然后执行DESCRIBEtbl_name语句,MySQL使用等效的MySQL类型来报告表的结构。例如:

mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC);

Query OK, 0 rows affected (0.08 sec)

 

mysql> DESCRIBE t;

+-------+---------------+------+-----+---------+-------+

| Field | Type          | Null | Key | Default | Extra |

+-------+---------------+------+-----+---------+-------+

| a     | tinyint(1)    | YES  |     | NULL    |       |

| b     | double        | YES  |     | NULL    |       |

| c     | mediumtext    | YES  |     | NULL    |       |

| d     | decimal(10,0) | YES  |     | NULL    |       |

+-------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值