mysql里面的东西都是做什么用的
MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255
SMALLINT:2字节 小整数,带符号:-32768~32767,不带符号:0~65535
MEDIUMINT:3字节 中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215
INT:4字节 标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295
BIGINT:8字节 大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615
FLOAT:4字节 单精度浮点数,最小非零值:+-1175494351E-38,最大非零值:+-3402823466E+38
DOUBLE:8字节 双精度浮点数,最小非零值:+-22250738585072014E-308,最大非零值:+-17976931348623157E+308
DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型
MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
浮点型数据列类型
MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。
MySQL 402版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。
浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默认,当MySQL版本大于3236时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3236后可选,默认D值为0,M值为10。
如何选择数值类数据列类型?
为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列,则MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是-32768~32767,所以就会被截短成32767存储。显示宽度3不会影响数值的存储。只影响显示。
对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。如把一个1234存入FLOAT(61)数据列中,结果是12。
DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。它的优点是,不会象FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行直接运算,从而影响运算效率。DECIMAL(M,D)总共要占用M+2个字节。
数值类数据列的属性
ZEROFILL属性适用于所有数值类数据列类型,作用是,如果数值的宽度小于定义的显示宽度,则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。
//////////////////////////////////////////////////////
字符串类数据列类型
字符串可以用来表示任何一种值,所以它是最基本的类型之一。
我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。
下表介绍了各种字符串类型:
CHAR[(M)] M字节 M字节
VARCHAR[(M)] M字节 L+1字节
TINYBLOD,TINYTEXT 2^8-1字节 L+1字节
BLOB,TEXT 2^16-1字节 L+2
MEDIUMBLOB,MEDIUMTEXT 2^24-1字节 L+3
LONGBLOB,LONGTEXT 2^32-1字节 L+4
ENUM('value1','value2',) 65535个成员 1或2字节
SET('value1','value2',) 64个成员 1,2,3,4或8字节
L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。
如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。
ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。
字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:
二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。
非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。
在MySQL41以后的版本中,不同的数据列可以使用不同的字符集。在MySQL41版本以前,MySQL用服务器的字符集作为默认字符集。
非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:
二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。
非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。
二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字节字符集,它能容纳的字符个数肯定少于20个。
CHAR和VARCHAR
CHAR和VARCHAR是最常用的两种字符串类型,它们之间的区别是:
CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。
VARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。
CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL402版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。
如何选择CHAR和VARCHAR,这里给出两个原则:
如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。
如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
在一个数据表里,只要有一个数据列的长度是可变的,则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外,CHAR长度小于4的不会进行自动转换,因为MySQL会认为这样做没必要,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减少空间占用量。
BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串。两者都可存放大容量的信息。
有关BLOB和TEXT索引的建立:
BDB表类型和MySQL3232以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。
ISAM、HEAP和InnoDB表不支持大对象列的索引。
使用BLOB和TEXT应注意的问题:
由于这两个列类型所存储的数据量大,所以删除和修改操作容易在数据表里产生大量的碎片,需定期运行OPTIMIZE TABLE以减少碎片和提高性能。
如果使用的值非常巨大,就需对服务器进行相应的优化调整,增加max_allowed_packet参数的值。对那些可会用到变些巨大数据的客户程序,也需加大它们的数据包大小。
ENUM和SET
ENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是:
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。
ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。
ENUM的合法取值列表中的字符串被按声明定义的顺序被编号,从1开始。
SET的编号不是按顺序进行编号的,SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位,第二个合法取值对应1位,以此类推,如果数值形式的SET值等于0,则说明它是一个空字符串,如果某个合法的取值出现在SET数据列里,与之对应的位就会被置位;如果某个合法的取值没有出现在SET数据列里,与之对应的位就会被清零。正因为SET值与位有这样的对应关系,所以SET数据列的多个合法取值才能同时出现并构成SET值。
字符串类型数据列的字符集属性
在MySQL 41以前的版本,字符串数据列的字符集由服务器的字符决定,MySQL 41版以后的版本可对每个字符串数据列指定不同的字符串。如果按默认方式设置,可按数据列、数据表、数据库、服务器的顺序关联字符串的字符集,直到找一个明确定义的字符集。
/////////////////////////////////////////////////////////
日期,时间型数据列类型
DATE 1000-01-01~9999-12-31 3字节(MySQL323版以前是4字节 ) 0000-00-00
TIME -838:59:59~838:59:59 3字节 00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8字节 0000-00-00 00:00:00
TIMESTAMP 19700101000000~2037年的某个时刻 4字节 00000000000000
YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1字节 0000
MySQL总是把日期和日期里的年份放在最前面,按年月日的顺序显示。
DATE、TIME、DATATIME数据列类型
DATE、TIME和DATATIME类型分别存放日期值、时间值、日期和时间值的组合。它们的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。
DATATIME里的时间值和TIME值是有区别的,DATATIME里的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,需用时间的完整写法,如12分30秒要写成“00:12:30”。
TIMESTAMP数据列类型
TIMESTAMP数据列的格式是CCYYMMDDhhmmss,取值范围从19700101000000开始,即1970年1月1号,最大到2037年。它的特点是能把数据行的创建或修改时间记录下来:
如果把一个NULL值插入TIMESTAMP列,这个数据列就将自动取值为当前的日期和时间。
在创建和修改数据行时,如果没有明确对TIMESTAMP数据列进行赋值,则它就会自动取值为当前的日期和时间。如果行中有多个TIMESTAMP列,只有第一个会自动取值。
如果对TIMESTAMP设置一个确定的日期和时间值,则会使TIMESTAMP的自动取值功能失效。
TIMESTAMP默认的列宽是14,可指定列宽,以改变显示效果。但不论你指定的列宽如何,MySQL都是以4字节来存储TIMESTAMP值,也总是以14位精度来计算。
如果需要把创建时间和最近一次修改时间同时记录下来,可以用两个时间戳来记录,一个记录创建时间,一个记录修改时间。不过需记住两件事,一是要把记录修改时间的TIMESTAMP数据列放在最前面,这样才会自动取值;二是创建一条新记录时,要用now()函数来初始化创建时间TIMESTAMP数据列,这样,该TIMESTAMP数据列就不会再变化。
YEAR
YEAR是一种单字节的数据列类型,YEAR(4)的取值范围是1901~2155,YEAR(2)的取值范围是1970~2069,但只显示最后两位数。MySQL能自动把两位数字年份转换成四位数字的年份,如97和14分被转换成1997和2014。转换规则是这样的:
年份值00~69将被转换成2000~2069;
年份值70~99将被转换成1970~1999。
00被转换成0000,而不是2000。因为数值00也就是0,而0值是YEAR的一个合法取值。
0 先理解下格式问题
要理解两种格式,一是mysql内部使用和存储时使用的格式,另一个是用户显示的格式;
存储格式:mysql保存日期时间值时使用的CCYY-MM-DD格式遵循ISO 8601标准;
显示格式:显示在输出界面上的格式,可以使用DATA_FORMAT()或TIME_FORMAT()函数来设置和转换;
1 转换和处理
1)提交数据,一是使用标准格式让其自动识别,二是对输入值进行格式指定和转换
insert into t (d) values('2012-01-01'); #使用默认ansi标准格式,让数据库自动识别字串为日期;
insert into t (d) values( STR_TO_DATE('2012/February/01', '%Y/%M/%d') ); #使用字符转换为日期的函数来处理自定义格式的输入值;
2)查询数据,一是不使用格式(即使用默认的CCYY-MM-DD格式),二是指定输出格式
select current_date(); #默认格式
select date_format(current_date(), ''%Y/%M/%d''); #使用自定义格式,具体参考下date_format的帮助,主要是格式控制符的使用。
2 格式化参数
DATE_FORMAT(), TIME_FORMAT(), STR_TO_DATE()这三个函数都接受格式化串作为参数来格式化日期时间
常用的格式化字符:
%Y 4位数字年份 2012
%y 2位数字年份 12
%M 完整英文月份名称,January - December
%b 月份名称前三个字母,Jan - Dec
%m 2位数字月份 01-12
%c 最小位数字月份 1-12
%d 2位数字日期 01-31
%e 最小位数字日期 1-31
%W 工作日名称 Sunday - Saturday
%r 12小时制时间,以AM或PM结尾
%T 24小时制时间
%H 24小时制小时 00-23
%i 2位数字分钟 00-59
%s 2位数字秒数 00-59
%% %文字字符
○最蓝的眼睛
这就是那所房子,绿白两色,有一扇红色的门,非常漂亮。这就是那一家人,母亲、父亲、迪克和珍妮就住在那所绿白两色的房子里,他们生活得很幸福。看见珍妮了吧,她穿着一条红裙子。她想玩,谁会和珍妮玩呢?看见小猫了吧,小猫喵喵地叫。过来玩呀,过来和珍妮玩呀,小猫不愿玩。看见母亲了吧,母亲很和善。母亲,你愿和珍妮玩吗?母亲大笑。笑吧,母亲,笑吧。看见父亲了吧,他又高又壮。父亲,你愿和珍妮玩吗?父亲笑了。笑吧,父亲,笑吧。看见小狗了吧,小狗汪汪地叫。你愿和珍妮玩吗?看见小狗跑了吧。跑吧,小狗,跑吧。看那,看那,来了一位朋友。他愿和珍妮玩。他们要玩一个有趣的游戏。玩吧,珍妮,玩吧。
1941年的秋季,金盏花没有出芽。对此我们都缄口不言,心照不宣。当时我们以为金盏花发不出芽是因为佩科拉怀了父亲的孩子。其实多几分观察少几分伤感就能证明不仅我们的种子没有发芽,别人的种子也未发芽。连湖边花园里的金盏花那年也未发芽。可是由于我们对佩科拉的健康以及她孩子的平安出世极其焦虑,脑子里整天想的只有我们自己的魔力:假如我们撒下花种后接着说上几句吉利的话,种子就会发芽,一切也就太平无事了。
很久以后,姐姐和我才承认我们的花种是发不出绿芽来了。一旦认识到这一点,悔恨即被吵架代替,互相指责,认为责任该由对方承担。很多年以后我还一直认为姐姐的话是对的:是我的过错。我把种子埋得太深了。我们俩谁都未意识到可能是土壤本身太贫瘠了。我们把种子撒在自己的一小块黑土地里,就像佩科拉的父亲把他的种子撒在他的黑土地里一样。我们的幼稚与期盼和他的兽欲与绝望一样的一无所获。现在清楚了,在那些希望、恐惧、情欲、悲痛中惟一留存下来的只有佩科拉和那贫瘠的土地。乔利·布里德洛夫死了;我们的纯真稚气也死了。种子枯死了,她的孩子也死了。
其实再没什么好说的了--除了问一个为什么。然而,由于很难说清为什么,只能借助于讲述事情的来龙去脉了。
■秋
在希腊旅馆的前厅里,嬷嬷们的脚步和欲火一样悄然无声,而喝醉了酒的男人和机敏的眼睛一齐唱着歌。罗莎玛丽·弗拉努奇是我们的隔壁邻居,住在她父亲开的咖啡店的楼上。此刻她正坐在1939年的别克牌小汽车里吃着黄油面包。她摇下车窗对我姐姐弗里达和我说我们不能上车。我们瞪眼瞧着她,想要她的面包,但更想把她眼光里的傲气给抠出来,打掉她翘嘴吃东西时流露出来的拥有财富的自豪感。等她从车里出来时我们要痛打她一顿,在她白晰的皮肤上留下红印儿。然后她就会大哭,问我们是否要让她脱裤子。我们会说不要。如果她真脱,我们还真不知道该怎么应付。但是不管她怎么央求我们,我们知道她总是在向我们进贡她最为珍贵的东西。而我们必须拒绝她的进贡,以表示我们的傲气。
开学了,弗里达和我有了新的棕色长筒袜和鱼肝油。大人们在一起神色不安地谈论着锡克的煤炭公司,嗓音里充满了倦意。到了晚上,我们跟着他们到铁路沿线把散落在地上的小块煤炭拣进麻袋里。之后我们走回家,回头看着整车的煤渣被卸在铁厂四周的深坑里,红通通的,仍在冒着烟。将熄的火焰把天空染成暗暗的橘红色。弗里达和我落在后面,望着被黑暗包围的一点光亮。当双脚离开铁道的石子路踏进田里的枯草时,我们禁不住打了个寒战。
我们住的房子是绿色的,又旧又冷。到了晚上只有大屋里点了盏煤油灯,其他屋子则充满了黑暗、蟑螂和老鼠。大人们不和我们说话--他们只发布命令。他们只管发号施令而不加以说明。我们绊跤摔倒时他们向我们瞪眼;我们割破摔伤时他们就说你们疯了吗;我们要是感冒着凉,他们就不耐烦地连连摇头,认为给他们添麻烦了--他们会说如果你们都病了,大人还怎么干活?我们无言以对。用来治疗感冒的药是厌烦的态度,气味难闻的黑药水,以及让我们昏昏欲睡的蓖麻籽油。
有一天,拣完煤渣回来,我大咳了一声。咳嗽声是从早已充满痰液的支气管里发出来的。母亲皱起了眉头。"上帝啊,赶紧上床,我跟你说过多少次要把头包起来。你肯定是这镇子上最大的傻瓜。弗里达,找些旧布把窗户缝堵上。"
弗里达把窗户缝又堵了一遍。我有气无力地上了床,心里充满了内疚与自悔。我穿着内衣躺下。尽管袜钩弄痛了我的腿,我也不愿意把长袜脱掉,因为光着腿躺着实在太冷了。过了很长时间,身子挨着的那块地方才暖和过来。一旦把那块地方焐热了我就不敢动了,因为身子四周半英寸之外的地方都是凉的。没人跟我说话,也没人问我感觉如何。一两小时之后母亲进来了,她的手又大又粗糙。当时用软膏在我胸上来回揉搓时,我疼得绷紧了身子。她用两个手指一次抠一大块油膏,在我胸上按摩直到我晕过去。正当我痛得要叫出声来时,她用食指又抠了一小块塞进我的嘴里,让我吞下去。她用暖烘烘的绒布毯子把我的脖子和前胸裹起来,然后压上沉甸甸的被子,命令我发汗。很快我就出汗了。
0条评论