zoukankan      html  css  js  c++  java
  • 数据库复习 3 创建表 数据类型

    创建表

    创建表完整语句
    create table 表名(
        字段名1 类型[(宽度) 约束条件],
        字段名2 类型[(宽度) 约束条件],
        字段名3 类型[(宽度) 约束条件]
    );

    数值类型

    整型类型测试
    mysql> create table t1(money tinyint);  
    #注意,创建表时最后一个字段后面不能有逗号,错误写法
    mysql> create table t1(money tinyint,);   1字节
    
    mysql> insert into t1 values(11);
    Query OK, 1 row affected (0.28 sec)
    
    mysql> select * from t1;
    
    mysql> insert into t1 values(-10);  
    Query OK, 1 row affected (0.11 sec)   
    
    mysql> select * from t1;
    
    mysql> insert into t1 values(-200);
    Query OK, 1 row affected, 1 warning (0.10 sec)
    
    mysql> select * from t1;
    
    设置了数据类型,会有一个约束效果,只能表示自己范围内的数
    
    创建无符号数值类型的写法:
    mysql> create table t2(id tinyint unsigned);

    浮点型

    测试
    mysql> create table t3(id float(60,30));
    Query OK, 0 rows affected (1.70 sec)
    
    mysql> create table t4(id double(60,30));
    Query OK, 0 rows affected (0.88 sec)
    
    mysql> create table t5(id decimal(60,30));
    Query OK, 0 rows affected (0.96 sec)
    
    mysql> insert into t3 values(1.1111111111111111111111);
    Query OK, 1 row affected (0.13 sec)
    
    mysql> insert into t4 values(1.1111111111111111111111);
    Query OK, 1 row affected (0.22 sec)
    
    mysql> insert into t5 values(1.1111111111111111111111);
    Query OK, 1 row affected (0.09 sec)
    
    mysql> select * from t3;
    mysql> select * from t4;
    mysql> select * from t5;

       

    sql模式  sql_mode  

     默认宽松模式 

      select @@sql_mode   查看当前窗口的设置

      select @@global.sql_mode   查看全局设置

      set session sql_mode ='STRICT_TRANS_TABLES'   设置为严格模式

        'xx'中可以有多种模式 还有默认宽松模式 NO_ENGINE_SUBSTITUTION

      set global sql_mode = 'STRICT_TRANS_TABLES'   设置全局模式

    在my.ini 配置文件中加入 sql_mode = STRICT_TRANS_TABLES

    模式设置和修改(以解决上述问题为例):
    
        方式一:先执行select @@sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set sql_mode = '修改后的值'或者set session sql_mode='修改后的值';,例如:set session sql_mode='STRICT_TRANS_TABLES';改为严格模式 #session可以不用写
    
            此方法只在当前会话中生效,关闭当前会话就不生效了。
    
        方式二:先执行select @@global.sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set global sql_mode = '修改后的值'。
    
        此方法在当前服务中生效,重新MySQL服务后失效
        方法三:在mysql的安装目录下,或my.cnf文件(windows系统是my.ini文件),新增 sql_mode = STRICT_TRANS_TABLES
    
    添加my.cnf如下:
    [mysqld]            sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER

    字符串类型

    char和varchar

    char和varchar性能对比:
        以char(5)和varchar(5)来比较,加入我要存三个人名:sb,ssb1,ssbb2
        char:
          优点:简单粗暴,不管你是多长的数据,我就按照规定的长度来存,5个5个的存,三个人名就会类似这种存储:sb ssb1 ssbb2,中间是空格补全,取数据的时候5个5个的取,简单粗暴速度快
          缺点:貌似浪费空间,并且我们将来存储的数据的长度可能会参差不齐
    
        varchar:
          varchar类型不定长存储数据,更为精简和节省空间
          例如存上面三个人名的时候类似于是这样的:sbssb1ssbb2,连着的,如果这样存,请问这三个人名你还怎么取出来,你知道取多长能取出第一个吗?(超哥,我能看出来啊,那我只想说:滚犊子!)
          不知道从哪开始从哪结束,遇到这样的问题,你会想到怎么解决呢?还记的吗?想想?socket?tcp?struct?把数据长度作为消息头。
    
          
          所以,varchar在存数据的时候,会在每个数据前面加上一个头,这个头是1-2个bytes的数据,这个数据指的是后面跟着的这个数据的长度,1bytes能表示2**8=256,两个bytes表示2**16=65536,能表示0-65535的数字,所以varchar在存储的时候是这样的:1bytes+sb+1bytes+ssb1+1bytes+ssbb2,所以存的时候会比较麻烦,导致效率比char慢,取的时候也慢,先拿长度,再取数据。
    
          优点:节省了一些硬盘空间,一个acsii码的字符用一个bytes长度就能表示,但是也并不一定比char省,看一下官网给出的一个表格对比数据,当你存的数据正好是你规定的字段长度的时候,varchar反而占用的空间比char要多。
    
    Value    CHAR(4)    Storage Required    VARCHAR(4)    Storage Required
    ''    '    '    4 bytes    ''    1 byte
    'ab'    'ab  '    4 bytes    'ab'    3 bytes
    'abcd'    'abcd'    4 bytes    'abcd'    5 bytes
    'abcdefgh'    'abcd'    4 bytes    'abcd'    5 bytes
            
          缺点:存取速度都慢
      总结:
        所以需要根据业务需求来选择用哪种类型来存
        其实在多数的用户量少的工作场景中char和varchar效率差别不是很大,最起码给用户的感知不是很大,并且其实软件级别的慢远比不上硬件级别的慢,所以你们公司的运维发现项目慢的时候会加内存、换nb的硬盘,项目的效率提升的会很多,但是我们作为专业人士,我们应该提出来这样的技术点来提高效率。
    
        但是对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。
    
        所以啊,两个选哪个都可以,如果是大型并发项目,追求高性能的时候,需要结合你们服务器的硬件环境来进行测试,看一下char和varchar哪个更好,这也能算一个优化的点吧~~~~

    枚举和集合类型

  • 相关阅读:
    MySQL约束笔记
    MySQL 存储过程入门
    数据库范式
    Hibernate 懒加载 错误----no session
    复选框 checkbox 选中事件
    Hibernate 三种状态变化 与 sql 语句的关系
    Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况
    35个java代码性能优化总结
    为什么 Java中1000==1000为false而100==100为true?AND "2+2=5"?
    MyBatis对象关联关系----多对多的保存与查询
  • 原文地址:https://www.cnblogs.com/zhuangdd/p/14092747.html
Copyright © 2011-2022 走看看