Mysql的数据类型主要分为三类:数字类型、字符串(字符)类型、日期和时间类型,由于时间紧迫,根据学习的需要
数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类型;
注:数据类型支持附加参数,例如:float(7,3),7代表显示的数值不能超过7,3表示小数点后面有三位数字;
1.字符串类型详解
.字符串类型可分为3类,普通的文本字符串类型(char和varchar)、可变类型(text和blob)和特殊类型(set和enum)
定长字符串:定长字符串通常具有相同的长度,是使用定长数据类型保存的。在定长数据类型里,通常使用空格来填充不足的字符,char就属于定长字符串。比如:char(10) 如果字段长度是10,而输入的数据只有5位,那么剩余的5位就会被记录为空格,使用空格填充,填充空格确保了字段里每个值都具有相同的长度,如果插入字符数据超过设定长度,则会被截取下来,多余的存不进去。
变长字符串:也就是长度不固定的字符串。如varchar。定长数据类型利用空格来填充字段里的空白,但变长字符串不这样做。举例来说,如果某个变长字段的长度定义为10,而输入的字符串长度为5,那么这个值的总长度也就是5,这时并不会使用空格来填充字段里的空白。
1.普通的文本字符串类型
char char可以附加参数即:char(n) ,n表示字节数 . |
char(n)与char都属于定长字符串 取值范围为0-255个字符。 char(n)在保存的时候,后面会用空格填充到指定的长度,检索的时候后面的空格会去掉。例如:保存字符串’LENOVO ’,共6个英文字母,char(60): 6个字母,补齐54个空格,实际占用60个字节(一个英文字母占用一个字符)。char会造成空间浪费,但是有速度优势 。如果插入字符数据超过60,则会被截取下来,多余的存不进去。
|
varchar; varchar也可以指定字节数:varchar(n) |
在mysql5.0以前,varchar或varchar(n)的取值范围最大为0-255个字符,mysql5.0版本以后,,varchar(n)或varchar的取值范围最大为65535个字节长度;(所以参考书中如果写的varchar(n)取值范围是0-255,它是写的Mysql5.0版本之前的取值范围。)
varchar或varchar(n)属于(可变字符串)变长字符串,varchar(n)后面不会用空格代替。例如:保存字符串’LENOVO ’,共6个英文字母,VARCHAR(60) :6个字母,实际占用6+1个字节。
特点1:它比使用固定长度类型(char类型)占用更少的存储空间; 2. varchar(n)会使用额外的1-2个字节存储值长度。列长度n<=255使用一字节保存,n>255使用2字节保存。例如:varchar(10)会占用11字节存储空间;varchar(500)会总共占用502个字节存储空间; 3. varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。 MySQL 数据库的varchar类型在4.1以下的版本中,varchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则: a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。 b) 编码长度限制 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。 c) 行长度限制 导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示 ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。 |
varchar与char比较 | varchar比较节约存储空间,但效率较低 char效率比varchar效率高,速度快,但比较存储空间。 |
数据的检索效率由高到低:char>varchar>text(下文中将讲解test类型的字符串)
https://www.cnblogs.com/muffe/p/4314537.html(参考网站)
2.可变类型(TEXT与BLOB)
a)text:用来存储长文本;
b)BLOB:BLOB二进制大对象,是一个可以存储二进制文件的容器,在计算机中,BLOB常常是数据中用来存储二进制文件的字段类类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音,由于他们的尺寸,必须使用特殊的方式来处理。
text与blob,它们的大小可以改变,text类型适合存储长文本,而blob类型适合存储二进制数据,支持任何数据,如文本、声音和图像。text和blob类型的介绍如下。
类型 | 最大长度 | 说明 |
TINYBOLB(非常小的BOLB(二进制大对象)) | 0-255字节 | 小的BLOB字段。 不超过255个字符的二进制字符串 |
BLOB | 0-65535字节 | 常规的BLOB字段 (二进制形式的长文本数据) |
MEDIUMBLOB | 0-16777215字节 | 中型BLOB字段 (二进制形式的中等长度文本数据) |
LONGBLOB | 0-4294967295字节 | 长BLoB字段 (二进制形式的极大文本数据) |
TINYTEXT | 0-255字节 | 小的TEXT字段 (短文本字符串) |
TEXT | 0-65535字节 | 常规的TEXT 字段 (长文本数据) |
MEDIUMTEXT | 0-16777215字节 | 中型TEXT字段 (中等长度的文本数据) |
LONGTEXT | 0-4294967295字节 | 长TEXT字段(极大地文本数据) |
存储文本的类型TEXT系列:(Text是变长的,存多少,占多少)
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
注:CHAR为定长,VARCHAR和TEXT为变长
CHAR会造成空间浪费,但是有速度优势 (浪费空间,节约时间
VARCHAR和TEXT节省了空间,但是速度就不如CHAR (浪费时间,节约空间)
【建议】:
(1)经常变化的字段用VARCHAR
(2)知道固定长度的用CHAR
(3)尽量用VARCHAR
(4)超过255字节的只能用VARCHAR或者TEXT
(5)能用VARCHAR的地方不用TEXT ,因为检索效率Varchar比Text高效.
数据的检索效率是:char>varchar>text
3.日期和时间类
lMySQL 带有 5 个不同的日期类型可供选择
被分成简单的日期(DATE)、时间类型(TIME),和混合日期和时间(DATETIME)、时间类型。根据要求的精度,子类型在每个分类型中都可以使用。
Year:(指标是年份)1911—2155
Date(表示的是日历:年、月、日)例如:1992-01-1
Time(表示时间(时分秒)):23:59:59
DateTime(日历+时间(年月日、十分秒)):例如:2018-11-27 02:34:59
TimestaMp(表示时间戳):某个时间段
4.数字类型
整数数据类型:
int ===对应Java中的int/integer
bigint==对应java中的Long/long
tinnint 、smallint、mediumint(这几个是不常用的。)
mysql是一个可选的显示宽度指示器的形式对sql标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度,例如:指定一个字段类型为int(6),就可以保证所包含数字少于6的值从数据库中检索出来时能够自动的用空格填充,需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值得范围,比如int(3)不是说最大只能存三个数,int它的范围是已经固定了的,这一点与char(n)不同,比如char(10),长度为10,最多可以输入10个字符,当然不足10个字符也可以不足的话前面用空格填充,而int(10)的10表示显示的数据的长度,不是存储数据的大小,长度不足前面补0,实际上,定义整数的时候,是用不到这个的。
浮点型数据类型
float ==对应java中的float
double:==对应java中的double
以上二者都支持附加参数,float(7,3)代表显示的数值长度不能超过7位,3表示小数点后有3位数字。
double(5,2)表示整数和小数一共占5位,其中小数占两位,不要理解为整数占5位。
但以上两者都不能精确的表示数值,比如计算金钱的话使用的是decimal数据类型,它对应java 中的bigdecimal;
5.Decima(精确小数类型)
decimal也可以有上面的那种写法,
Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数。Decimal属于精确小数类型。decimal 类型具有更高的精度和更小的范围,它适合于财务和货币计算。对于精度比较高的东西,比如money,用decimal类型,不会考虑float,double,因为他们容易产生误差..
decimal的详细介绍
decimal(a,b)
参数说明
a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。Decimal的数据类型默认小数位数是 0。
Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。
例:decimal(2,1),此时,插入数据“12.3”、“12”等会出现“数据溢出错误”的异常;插入“1.23”或“1.2345...”会自动四舍五入成“1.2”;插入“2”会自动补成“2.0”,以确保2位的有效长度,其中包含1位小数。
备注
DECIMAL数据类型用于要求非常高的精确度的计算中,这些类型允许指定数值的精确度和计数方法作为选择参数。精确度在这里是指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的个数。例如,语句DECIMAL (5,2)规定了存储的值将不会超过5位数字,开且小数点后面有2位数字。
Bit数据类型
Bit称为位数据类型,对应java 中Boolean(布尔数据类型)。其数据有两种取值:0和1,长度为1位。在输入0以外的其他值时,系统均把它们当1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等二值选择。其中0表示false,1表示true.