• 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字节,年份
  • 相关阅读:
    20080619 SQL SERVER 输入 NULL 的快捷键
    20090406 Adobe的“此产品的许可已停止工作”错误的解决办法
    20080908 Office Powerpoint 2007 不能输入中文的解决办法
    20080831 ClearGertrude Blog Skin 's cnblogs_code class
    20080603 Facebook 平台正式开放
    20080519 安装 Microsoft SQL Server 2000 时提示 创建挂起的文件操作
    test
    Linux—fork函数学习笔记
    SOA的设计理念
    Why BCP connects to SQL Server instance which start with account of Network Service fail?
  • 原文地址:https://www.cnblogs.com/1102whw/p/7811771.html
Copyright © 2020-2023  润新知