zoukankan      html  css  js  c++  java
  • MySQL基础(1) | 数据类型

    MySQL基础(1) | 数据类型


    1. 数值类型
    TINYINT #小整数值,1 字节,有符号(-128,127),无符号(0,255)
    SMALLINT #大整数值,2 字节
    MEDIUMINT #大整数值,3 字节
    INT或INTEGER #大整数值,4 字节,有符号(-2147483648,2147483647),无符号(0,4294967295)
    BIGINT #极大整数值,8 字节
    
    FLOAT #单精度浮点数值,4 字节
    DOUBLE #双精度浮点数值,8 字节
    DECIMAL #小数值,定点数,DECIMAL(M,D),其中M称为精度,表示总共的位数;D称为标度,表示小数的位数;默认D值为0、M值为10
    
    1. 时间类型
    DATE #日期值,YYYY-MM-DD,1000-01-01/9999-12-31
    TIME #时间值或持续时间,HH:MM:SS,'-838:59:59'/'838:59:59'
    YEAR #年份值,YYYY,1901/2155
    DATETIME #混合日期和时间值,8字节,YYYY-MM-DD HH:MM:SS,1000-01-01 00:00:00/9999-12-31 23:59:59
    TIMESTAMP #混合日期和时间值,时间戳,4字节,'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'
    
    1. 字符串类型
    # 字节型字符串【二进制字节型字符串,没有字符集概念】
    BINARY #定长二进制字节型字符串
    VARBINARY #变长二进制字节型字符串
    
    TINYBLOB #不超过 255 个字符的二进制字符串,0-255字节	
    BLOB #二进制形式的长文本数据,0-65 535字节	=> ~64kb
    MEDIUMBLOB #二进制形式的中等长度文本数据,0-16 777 215字节	=> ~16MB
    LONGBLOB #二进制形式的极大文本数据,0-4 294 967 295字节	=> ~4GB
    
    # 字节型字符串 end 
    
    # 字符型字符串
    
    CHAR #定长字符串,0-255字节
    VARCHAR #变长字符串,	0-65535 字节
    
    TINYTEXT #短文本字符串,0-255字节	
    TEXT #长文本数据,0-65535字节	=> ~64kb
    MEDIUMTEXT	#中等长度文本数据,0-16 777 215字节	=> ~16MB
    LONGTEXT #极大文本数据,0-4 294 967 295字节	=> ~4GB
    
    # 字符型字符串 end
    

    解析

    ① 区分字节型和字符型

    • BINARY(N)VARBINARY(N)中的N指的是字节长度。

    • CHAR(N)VARCHAR(N)中N指的是的字符长度。

    • 对于BINARY(10) ,其可存储的字节固定为10,而对于CHAR(10) ,其可存储的字节视字符集的情况而定。

    ②区分BINARY,VARBINARY ,CHAR,VARCHAR 四类插入和查询的不同机制

    • char(N)用来存储非二进制字符串,插入时,对于少于N个字符的会自动在尾部加空格,查询时,尾部的空格就会被丢弃掉【即插入时尾部的空格会被去掉】

    • vachar(N) 用来存储非二进制字符串,插入时,对于少于N个字符的不填补空格,查询时,尾部的空格不会被丢弃掉【即原样输出】

    • binary(N)存储二进制字符串,插入进,少于N个字节的会自动在尾部加0x00,取出时,所有的字节都保留,返回定义长度的字节长度,在比较的时候,所有的字节都是有效的【尾部会填充】

    • varbinary在插入不会去填补0x00字节,查询的时候也不会丢弃任何字节,在比较的时候,所有的字节都是有效的【也是原样输出】

      示例:

      create table test(
      	a VARCHAR(3),
      	b CHAR(3),
      	c VARBINARY(3),
      	d BINARY(3)
      )engine=innodb charset=gbk;
      
      insert into test select 'a ','a ','a ','a ';
      
      select hex(a),hex(b),hex(c),hex(d) from test;
      select concat('$',a,'$'),concat('$',b,'$'),concat('$',c,'$'),concat('$',d,'$')
      from test;
      SELECT a = 'a ', b = 'a', c = 'a ', d = 'a 'from test;
      

      结果集1:

      结果集1

      结果集2:

    ​ 结果集3:

    1. 扩展
    • VARCHAR:

      在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的【即varchar(xxx)括号内的xxx按字符串个数来定义】;在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度是(65535-2)/3=21844个字符(超过255个字节会有2字节的额外占用空间开销,所以减2;如果是255以下,则减1)。

    示例:

    #VARCHAR单表单字段最长不能超过21844
    CREATE TABLE test(
        va VARCHAR(21845)
    )DEFAULT CHARSET=utf8;
    [Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
    #这样就可以了
    CREATE TABLE test(
        va VARCHAR(21844)
    )DEFAULT CHARSET=utf8;
    受影响的行: 0
    时间: 0.155s
    
    • TEXT:

      最大限制也是64k个字节,但是本质是溢出存储。innodb默认只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中,虽然也受单表65535最大行宽度限制,但mysql表中每个BLOB和TEXT列实际只占其中的5至9个字节,其他部分将进行溢出存储。所以实际占用表最大行宽度为9+2字节,外加的是额外开销,跟表的实际宽度没有关系。

    • 获取当前时间的方法

    SELECT CURRENT_TIMESTAMP;
    SELECT CURRENT_TIMESTAMP();
    SELECT NOW();
    SELECT LOCALTIME;
    SELECT LOCALTIME();
    SELECT LOCALTIMESTAMP;
    SELECT LOCALTIMESTAMP();
    
    • 字符串转时间
    select str_to_date('2017-10-16 15:30:28','%Y-%m-%d %H:%i:%s'); 
    
    • 时间转字符串
    select date_format(now(), '%Y-%m-%d %H:%i:%s') ;
    
    • 通用类型转换方法
    #字符串转数字
    方法一:SELECT CAST('123' AS SIGNED);
    方法二:SELECT CONVERT('123', SIGNED);
    方法三:SELECT '123'+0;
    
    二进制,同带binary前缀的效果 : BINARY 
    字符型,可带参数 : CHAR() 
    日期 : DATE 
    时间: TIME 
    日期时间型 : DATETIME 
    浮点数 : DECIMAL 
    整数 : SIGNED 
    无符号整数 : UNSIGNED
    
  • 相关阅读:
    学习总结
    HBase简要介绍
    分布式文件系统HDFS
    Hadoop基础安装和使用
    大数据的学习基础
    学习总结
    Python-爬取豆瓣电影信息并存到mysql
    python爬虫回顾与总结
    正则表达式-爬虫获取豆瓣电影超链接
    BeautifulSoup相关学习
  • 原文地址:https://www.cnblogs.com/iwsx/p/12348929.html
Copyright © 2011-2022 走看看