Mysql数据类型

  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字节,年份
原文地址:https://www.cnblogs.com/1102whw/p/7811771.html