mysql的数据类型和sqlserver的数据类型基本一致,但是,mysql有个容易让人感到困惑的地方,那就是mysql的int、char、varchar这两种数据类型都要写成int(n)、char(n)、varchar(n)这种格式的,那么这里的这个n到底是什么意思呢?很多人都会认为,这里的n是最大保存长度,比如说。int(10)就能保存一个10位的数字,int(9)就只能保存一个长度是9位的数字。事实上不是这样的。首先来说一下int里面的n是什么意思。
按照mysql的官方解释:
int(M): M indicates the maximum display width for integer types.翻译成中文的意思就是,这里括号里面的M代表了最大的显示长度,而不是存储的长度。
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次方)
根据上面的信息可以得出结论:不管是int(10)还是int(9),最终都占四个字节,既然占的字节数是一个定值,那么最终能保存的数据范围也是一个定值。所以“int(10)就能保存一个10位的数字,int(9)就只能保存一个长度是9位的数字。是不对的。”
原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
另外,int(M) 只有跟 zerofill 结合起来,才能使我们清楚的看到不同之处。
实验一。
首先进入mysql的bin目录(第一步是连接mysql数据库,关于怎么在cmd下使用mysql数据库请参考另外一篇博客http://www.cnblogs.com/1102whw/p/7270897.html )
连接mysql数据库
创建一个测试数据库
查看所有数据库
在test数据库中创建第一张表,这张表是用来测试不加zerofill字段,int(4)和int(5)的区别。
插入(12345,123456)。很明显这两个字段的长度分别大于4和5。但是结果显示,这条数据成功的添加到了数据库里面,而且,没有发生截断。
我们再创建一个表,这次使用zerofill字段。我们发现,当插入的数据长度不足5位时,前面会用0来补足。
我们再插入一条超长的数据123456。根据查询结果显示,超长的数据没有被截断。
那么在定义字段的时候,能不能直接用int,而不是用int(n)呢。结论是可以的。因为,直接使用int,相当于使用的是int(10).因为我们发现前面用了9个0来补齐。
根据上面的结果我们可以得出结论:int(n)中的n只有在配合zerofill字段的时候才能发挥作用,而且只有在位数不够的时候才在前面补0,位数超长不发生截断,默认是10位。
但是,char(n)、varchar(n)又和int(n)里面的n是不一样的含义。我们再看一下官方的解释。
第一:讨论char(n)
The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length.When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH [581]SQL mode is enabled.
手册中指出,长度的限制是0-255,经过验证,长度的限制是0-255个字符。也就是说,没有明确标出字节的限制数。
也就是说,char(2)最多可以存储两个字符长度的字符串,char(5)最多可以存储五个字符长度的字符串。char最多能存储255个字符。
第二:讨论varchar(m)
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.The effective maximum length of a VARCHARis subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section E.10.4, “Table Column-Count and Row-Size Limits”.
官方文档指出,varchar 最多能存储65535个字节。
但是,不管是,char(n)还是varchar(m)中的n和m,都指的是能存储字符的长度,这里我们可以做第二个实验。注意,这里的第二个实验室建立在一个java web的例子上面的,不是在cmd界面进行,至于为什么不用cmd做char(n)和varchar(m)的实验,是因为http://www.cnblogs.com/1102whw/p/7815466.html这篇博客。
实验二
新建一个javaweb项目
数据库文件如下,注意,course表里面的name字段是varchar的,长度是50.
网站运行起来之后效果如图:
添加一门课程,课程的名字一共是50个汉字。
添加成功
编号为2的那门课程名称是50个数字,说明只要在50个以内,汉字和数字都可以。如果超过50个呢?我们编辑一下试试:多加一个字
后台报错
实验二完成,说明char(n)和varchar(m)都限制的是字符的长度。char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)
下面补充一下数据类型
1、整型
1 MySQL数据类型 含义(有符号) 2 tinyint(m) 1个字节 范围(-128~127) 3 smallint(m) 2个字节 范围(-32768~32767) 4 mediumint(m) 3个字节 范围(-8388608~8388607) 5 int(m) 4个字节 范围(-2147483648~2147483647) 6 bigint(m) 8个字节 范围(+-9.22*10的18次方)
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
2、浮点型(float和double)
1 MySQL数据类型 含义 2 float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位 3 double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
3、定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
1 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。
4、字符串(char,varchar,_text)
1 MySQL数据类型 含义 2 char(n) 固定长度,最多255个字符 3 varchar(n) 可变长度,最多65535个字符 4 tinytext 可变长度,最多255个字符 5 text 可变长度,最多65535个字符 6 mediumtext 可变长度,最多2的24次方-1个字符 7 longtext 可变长度,最多2的32次方-1个字符
5、日期和时间数据类型
1 MySQL数据类型 含义 2 date 3字节,日期,格式:2014-09-18 3 time 3字节,时间,格式:08:42:30 4 datetime 8字节,日期时间,格式:2014-09-18 08:42:30 5 timestamp 4字节,自动存储记录修改的时间 6 year 1字节,年份