3.2.1 MySQL常用数据类型

3.2.1 MySQL常用数据类型

从表3-2中的数据可以看出,表中的数据可能有数字,也可能有文字等,所以必须要掌握MySQL中常用的数据类型。

MySQL中常用的数据类型有数值类型、字符串类型、日期和时间类型、二进制数据类型、逻辑类型。

1.数值类型

MySQL支持所有标准SQL数值数据类型,其中包括严格数值数据类型(integer、smallint、decimal和numeric),以及近似数值数据类型(float、real和double precision)。

存储数值,每种类型具有不同的存储范围,只是取值范围越大,所需存储空间越多。所有数值类型(除bit和boolean外)都可以有符号或无符号,有符号数据列可存储正或负的数值,默认情况为有符号。具体类型描述见表3-5。

表3-5 常用的数值类型

MySQL提供了5种整型:tinyint、smallint、mediumint、int和bigint(字节数1、2、3、4、8),这些类型在可表示的取值范围上是不同的。整数列可定义为unsigned,从而禁用负值,这使列的取值范围为0以上。

MySQL提供三种浮点类型:float、double和decimal。与整型不同,浮点类型不能是unsigned的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。

在选择了某种数值类型时,应该考虑所要表示的值的范围,只需选择能覆盖要取值的范围的最小类型即可。选择较大类型会对空间造成浪费,使数据表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,如人员年龄或兄弟姐妹数,则tinyint最合适。mediumint能够表示数百万的值,并且可用于更多类型的值,但存储代价较大。bigint在全部整型中取值范围最大,并且需要的存储空间是整型int类型的两倍,因此只在必要时才用。对于浮点值,double占用float的两倍空间。除非特别需要高精度或范围极大的值,一般应使用只用一半存储代价的float型来表示数据。

在定义整型列时,可以指定可选的宽度指示器m显示大小。m为一个1~255的整数。m表示用来显示列中值的字符数。例如,mediumint(4)指定了一个具有4个字符显示宽度的mediumint列。如果定义了一个没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。如果某个特定值需要不止m个字符,则显示完全的值;不会将值截断以适合m个字符。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

对每种浮点类型,可指定一个最大的显示尺寸m和小数位数d。m的值应该取1~255的整数。d的值可为0~30,但是不应大于m-2。m和d对float和double都是可选的,但对于decimal是必需的。在选择m和d时,如果省略了它们,则使用缺省值。

2.字符串类型

这是最常用的数据类型,有两种基本的串类型:定长串和不定长串。定长串存储长度固定的字符,其长度是创建表时指定的,不允许多于指定的字符数据,它们分配的存储空间与指定的一样多,char属于定长串类型。变长串存储长度可变的文本,有些变长数据类型具有最大的定长,而有些则是完全变长的,不管哪种,只有指定的数据得到保存(不会添加额外的空格保存)。text属于变长串类型。变长数据类型灵活,定长数据类型高效,MySQL处理定长数据类型比变长列快很多,MySQL不允许对变长列(或一个列的可变部分)进行索引,这会极大地影响性能。具体类型描述见表3-6。

表3-6 常用的字符串类型

注意:不管何种形式的串数据类型,串值都必须在引号内(通常单引号更好);如果数值是计算中使用的数值,则应保存在数值数据类型列中;如果作为字符串使用(如电话号码、邮政编码、身份证号),则应保存在串数据类型列中。

3.日期和时间类型

MySQL中有多种表示日期和时间的数据类型。其中year表示年份,date表示日期,time表示时间,datetime和timestamp表示日期和时间。具体类型描述见表3-7。

表3-7 常用的日期和时间类型

注意,当插入值超出有效取值范围时,系统会报错,并将零值插入数据库中。

MySQL是以“yyyy-mm-dd”格式来显示date类型的值的,插入数据时,数据可以保持这种格式。另外,MySQL还支持一些不严格的语法格式,分隔符“-”可以用“@”“.”等符号来替代。在插入数据时,也可以使用“yy-mm-dd”格式,yy转化成对应的年份的规则与year类型类似。

time类型表示为“时:分:秒”,尽管小时范围一般是0~23,但是为了表示某些特殊时间间隔,MySQL将time的小时范围扩大了,并且支持负值。对time类型赋值,标准格式是“hh:mm:ss”,但不一定非要是这种格式。如果插入的是“d hh:mm:ss”格式,则类似插入了“(d*24+hh):mm:ss”。比如插入“2 23:50:50”,相当于插入了“71:50:50”。如果插入的是“hh:mm”或“ss”格式,则其他未被赋值位置的值为零。比如插入“30”,相当于插入了“00:00:30”;如果插入“11:25”,相当于插入了“11:25:00”。在MySQL中,对于“hhmmss”格式,系统能够自动转化为标准格式。如果想插入当前系统的时间,则可以插入current_time、current_date或者now()。

datetime类型准格式为“yyyy-mm-dd hh:mm:ss”,具体赋值方法与上面的方法相似。

timestamp的取值范围比较小,没有datetime的取值范围大,因此输入值时一定要保证在timestamp的范围之内。它的插入也与插入其他日期和时间数据类型类似。那么timestamp类型如何插入当前时间?第一,可以使用current_timestamp;第二,输入null,系统自动输入当前的timestamp;第三,无任何输入,系统自动输入当前的timestamp。另外,有很特殊的一点:timestamp的数值是与时区相关的。

给year类型赋值可以有三种方法:第一种是直接插入4位字符串或者4位数字。第二种是插入2位字符串,这种情况下如果插入“00~69”,则相当于插入2000~2069;如果插入“70~99”,则相当于插入1970~1999。第二种情况下插入的如果是“0”,则与插入“00”效果相同,都是表示2000年。第三种是插入2位数字,它与第二种(插入两位字符串)不同之处仅在于:如果插入的是一位数字0,则表示的是0000,而不是2000年。所以在给year类型赋值时,一定要分清0和“0”,虽然两者相差个引号,但实际效果确实相差了2000年。

4.二进制数据类型

二进制类型可存储任何数据,如文字、图像、多媒体等。具体类型描述见表3-8。

表3-8 常用的二进制数据类型

5.逻辑类型:bit

bit型数据只能取两个值:0或1。

MySQL保存逻辑值时,用1代表true,0代表false。boolean在MySQL里的类型为tinyint(1);bit类型在MySQL里有四个常量:true、false、TRUE、FALSE,它们分别代表1、0、1、0。