精华内容
下载资源
问答
  • -----------android培训、java培训、java+3G学习技术...",有这个疑问就说明你已经摸索到了枚举类型的最主要功能:以统一命名的常量来替换变化无常的直接量,这毫无疑问是枚举的最主要作用,在大多数情况下,用stati

    -----------android培训java培训、java+3G学习型技术博客、期待与您交流!------------

     我想几乎每一个学习java语言的人在学习枚举的时候首先的一个疑问就是"为什么不用static final字段替代?",有这个疑问就说明你已经摸索到了枚举类型的最主要功能:以统一命名的常量来替换变化无常的直接量,这是毫无疑问是枚举的最主要作用,在大多数情况下,用static final是足够的,所以N多知名的源码里我们会经常看到用static final字段定义的一系列常量;那么为什么要用枚举呢?有几个原因:
       
        枚举的元素是一个实例,所以也是一个类型,相对字段更具有扩展性:扩展自段、方法、遍历;
       
        枚举的申明类也是一个类型,相对于一段的字段申明的所属类,它提供了很多针对枚举的方法,如values();
       
        枚举访问、比较是兼具性能(ordinal)、及可读性(name)的;
       
        枚举是java里即是一种需要死记硬背的语法,也是一种需要好好理解的设计
       
        (体会大于解说)
       
        原理
       
        枚举提供了一套特定的、仅针对编译时的语法(在运行时枚举被翻译为普通类);为"枚举"这个功能提供了一套量身定制的语法。用于在"枚举"这个特定场合提供方便快捷、及相对可扩展的功能,而不需要开发人员自己再重新实现一套。enum这个东西,相对于class来说,前者仅是编译时的一个东西,在运行时enum也被翻译成了class,换句话说,没有enum,Java语言仍然保持相同强大的功能,只是在处理"枚举"这一类需求时,程序员可能会更头疼一点。
       
        枚举这个东西让我记起了小时候一件事情,买折扇;那时记得电视里经常放关于郑板桥的电视剧,郑板桥胸前经常有一把写着"郑板桥"三大字的析扇,所以那时流行起了拆扇风,记得镇上有一家小店的折扇卖得非常好,与一般小店不一样的是,那家卖折扇的老板书法也相当不错(至少我们那时看起来也是有模有样),所以每次买扇子时,我们都会要求老板帮忙在扇子上写上我们的名字,这样这个老板的扇子"推销"就相当成功;其它枚举这个功能,就相当于当年Sun老板(现在是oracle)在推销Java这把扇子上写上名字,虽然即使老板不写,我们自己也可以写,但是写得怎么样,或许更好?或许更差?但总的来说,老板写的还是有一定水准的,而且我们肯定是可以省力的。
       
        语法特征
       
        一句话搞定
       
        enum A{BigA, SmallA{ String extField; void doSomeThing(){}; }, LargeA}
       
        如果我们用class语法来实现,相当于(仅是相当于,只为了让大家了解到用原始的语法实现枚举的功能有多么复杂):
       
        final class A extends Enum{  //编译器给我们生成的字段、方法, 如values();   //相关构造函数  static final A BigA = new A("BigA", 0);  staitc final A SmaillA = new A("SmallA", 1){  void doSomeThing(){}  }  static final A BigA = new A("LargeA", 3);  }
       
        隐藏特性
       
        元素与元素间的区别用odinal字段,值从0开始依次递增
       
        元素的打印标记用name字段
       
        枚举元素编译后都是static final修饰
       
        枚举申明类至少用final修饰
       
        枚举申明类如果是其它类的成员类,那么编译后默认会加static修饰,变成静态员类
       
        枚举在编译时会自动加上一些"方法",如values();
       
        枚举类编译时自动继承Enum<E extend Enum<E》类,所以不能再继承其它类
       
        枚举的语法一定要好好理解

    -----------android培训java培训、java+3G学习型技术博客、期待与您交流!------------

    详细请查看:http://net.itheima.com

     

    展开全文
  • 在配置文件中指定默认的存储引擎(3)分别采用四种引擎的表的存储的对比二、表介绍三、创建表四、严格模式五、数据类型1、介绍2、数值类型(1)整数类型(2)浮点3、日期类型4、字符串类型(1)字符串知识点了解...

    下面是小凰凰的简介,看下吧!
    💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活
    💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习中)
    💗您的点赞、收藏、关注是对博主创作的最大鼓励,在此谢过!
    有相关技能问题可以写在下方评论区,我们一起学习,一起进步。
    后期会不断更新python全栈学习笔记,秉着质量博文为原则,写好每一篇博文。

    一、存储引擎介绍

    1、什么是存储引擎?

    mysql中建立的库 ---> 文件夹
    
    库中建立的表 ---> 文件
    

    现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

    数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,存取机制又称为存储引擎。

    2、mysql支持的存储引擎

    show engines\G # 查看所有存储引擎
    show variables like '%storage_engine%'; # 
    

    这里掌握四种存储引擎即可:

    # InnoDB 存储引擎
    支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
    特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
    
    InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
    
    对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
    
    
    # MyISAM 存储引擎
    不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
    
    # BLACKHOLE
    黑洞存储引擎,可以应用于主备复制中的分发主库。
    
    # Memory 存储引擎
    正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
    

    3、使用存储引擎

    (1)方法一:建表时指定
    MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
    MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
    MariaDB [db1]> show create table innodb_t1;
    MariaDB [db1]> show create table innodb_t2;
    
    (2)方法二:在配置文件中指定默认的存储引擎
    /etc/my.cnf
    [mysqld]
    default-storage-engine=INNODB
    innodb_file_per_table=1 # 增加innodb_file_per_table参数,可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。
    
    (3)分别采用四种引擎的表的存储的对比
    MariaDB [db1]> create table t1(id int)engine=innodb;
    MariaDB [db1]> create table t2(id int)engine=myisam;
    MariaDB [db1]> create table t3(id int)engine=blackhole;
    MariaDB [db1]> create table t4(id int)engine=memory;
    

    在这里插入图片描述注意:innodb也有索引只不过没有像myisam那样单独成一个文件。

    # memory,在重启mysql或者重启机器后,表内数据清空
    # blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
    

    二、表介绍

    表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段
    在这里插入图片描述id,name,qq,age称为字段,其余的,一行内容称为一条记录

    三、创建表

    # 语法:
    create table 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    );
    
    # 注意:
    1. 在同一张表中,字段名是不能相同
    2. 宽度和约束条件可选
    3. 字段名和类型是必须的
    
    # 实操:
    MariaDB [(none)]> create database db1 charset utf8;
    
    MariaDB [(none)]> use db1;
    
    MariaDB [db1]> create table t1(  
        -> id int, 
        -> name varchar(50),
        -> sex enum('male','female'),
        -> age int(3)
        -> );
    
    MariaDB [db1]> show tables; # 查看db1库下所有表名
    
    MariaDB [db1]> desc t1;
    +-------+-----------------------+------+-----+---------+-------+
    | Field | Type                  | Null | Key | Default | Extra |
    +-------+-----------------------+------+-----+---------+-------+
    | id    | int(11)               | YES  |     | NULL    |       |
    | name  | varchar(50)           | YES  |     | NULL    |       |
    | sex   | enum('male','female') | YES  |     | NULL    |       |
    | age   | int(3)                | YES  |     | NULL    |       |
    +-------+-----------------------+------+-----+---------+-------+
    

    往表中插入数据

    MariaDB [db1]> insert into t1 values
        -> (1,'吴晋丞',18,'male'),
        -> (2,'haha',81,'female')
        -> ;
    MariaDB [db1]> select * from t1;
    +------+------+------+--------+
    | id   | name | age  | sex    |
    +------+------+------+--------+
    |    1 | 吴晋丞|   18 | male   |
    |    2 | haha |   81 | female |
    +------+------+------+--------+
    

    四、严格模式

    何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错,而是将写入的数据截取定义长度存入数据库。我认为这个对于编程来说没有任何好处,虽然我们尽量在代码中做数据校验。MySQL开启了严格模式从一定程序上来讲是对我们代码的一种测试,如果我们的开发环境没有开启严格模式在开发过程中也没有遇到错误,那么在上线或代码移植的时候将有可能出现不兼容的情况,因此在最好开启MySQL的严格模式。

    如何开启?

    set session sql_mode = 'STRICT_TRANS_TABLES' # 当前窗口生效,下次重启数据库,便不起作用了
    set global sql_mode = 'STRICT_TRANS_TABLES' # 全局修改,下次重启依然有效
    
    也可以在my.cnf的[mysqld]中添加参数:
    sql-mode="STRICT_TRANS_TABLES"
    

    注意:5.7以前版本的数据库严格模式默认关闭的,5.7及之后版本的数据库严格模式默认开启

    五、数据类型

    1、介绍

    存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的

    mysql常用数据类型概览

    1. 数字:
        整型:tinyinit  int  bigint
        小数:
            float :在位数比较短的情况下不精准
            double :在位数比较长的情况下不精准
                0.000001230123123123
                存成:0.000001230000
    
            decimal:(如果用小数,则用推荐使用decimal)
                精准
                内部原理是以字符串形式去存
    
    2. 字符串:
        char10):简单粗暴,浪费空间,存取速度快
            root存成root000000
        varchar:精准,节省空间,存取速度慢
    
        sql优化:创建表时,定长的类型往前放,变长的往后放
                        比如性别           比如地址或描述信息
    
        如果一个数据文件>255个字符,超了就把文件路径存放到数据库中。
                比如图片,视频等找一个文件服务器,数据库中只存路径或url。
    
    
    
    3. 时间类型:
        最常用:datetime
    
    
    4. 枚举类型与集合类型
    

    2、数值类型

    (1)整数类型

    整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
    作用:存储年龄,等级,id,各种号码等
    在这里插入图片描述上述类型都分有符号和无符号两种,默认的类型采用的是有符号的,也可以添加unsigned参数实现采用无符号。

    ========================================
            tinyint(m) unsigned zerofill
    
                小整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                    -128127
                无符号:
                    0255
    
                PS: MySQL中无布尔值,使用tinyint(1)构造。
    
    
    
    ========================================
            int(m) unsigned zerofill
    
                整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                        -21474836482147483647
                无符号:
                        04294967295
    
    
    
    ========================================
            bigint(m) unsigned zerofill
                大整数,数据类型用于保存一些范围的整数数值范围:
                有符号:
                        -92233720368547758089223372036854775807
                无符号:
                        018446744073709551615
    

    验证unsigned参数:

    =========有符号和无符号tinyint==========
    #tinyint默认为有符号
    MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
    MariaDB [db1]> desc t1;
    MariaDB [db1]> insert into t1 values
        -> (-129),
        -> (-128),
        -> (127),
        -> (128);
    MariaDB [db1]> select * from t1;
    +------+
    | x    |
    +------+
    | -128 | #-129存成了-128
    | -128 | #有符号,最小值为-128
    |  127 | #有符号,最大值127
    |  127 | #128存成了127
    +------+
    
    
    
    #设置无符号tinyint
    MariaDB [db1]> create table t2(x tinyint unsigned);
    MariaDB [db1]> insert into t2 values
        -> (-1),
        -> (0),
        -> (255),
        -> (256);
    MariaDB [db1]> select * from t2;
    +------+
    | x    |
    +------+
    |    0 | -1存成了0
    |    0 | #无符号,最小值为0
    |  255 | #无符号,最大值为255
    |  255 | #256存成了255
    +------+
    

    验证zerofill参数:

    int(5),这里圆括号中的数字在大家的认知中是指定数据大小限制,其实不是,'只是在字符类型中是这样的',但在整数类型中仅仅只是'指定查询结果的最小显示的长度'
    
    ======用zerofill测试整数类型的显示宽度=============
    MariaDB [db1]> create table t7(x int(3) zerofill);
    MariaDB [db1]> insert into t7 values
        -> (1),
        -> (11),
        -> (111),
        -> (1111);
    MariaDB [db1]> select * from t7;
    +------+
    | x    |
    +------+
    |  001 | # int(3),不够三个长度,默认以空格填补够三个,但是空格我们看不出来,zerofill参数是用0代替空格进行填充。这样我们就能看出来了
    |  011 |
    |  111 |
    | 1111 | # 超过宽度限制仍然可以存
    +------+
    
    
    (2)浮点型

    定点数类型 DEC等同于DECIMAL  
    浮点类型:FLOAT DOUBLE
    作用:存储薪资、身高、体重、体质参数等
    在这里插入图片描述

    ======================================
    1. float(m,d) unsigned zerofill
    
    定义:
            单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    
    有符号:
               -3.402823466E+38 to -1.175494351E-38,
               1.175494351E-38 to 3.402823466E+38
    无符号:
               1.175494351E-38 to 3.402823466E+38
    
    
    精确度: 
               **** 随着小数的增多,精度变得不准确 ****
    
    
    ======================================
    2. double(m,d) unsigned zerofill
    
    定义:
               双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    
    有符号:
               -1.7976931348623157E+308 to -2.2250738585072014E-308
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    无符号:
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    精确度:
               ****随着小数的增多,精度比float要高,但也会变得不准确 ****
    
    ======================================
    3. decimal(m,d) unsigned zerofill
    
    定义:
              准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
    
    
    精确度:
               **** 随着小数的增多,精度始终准确 ****
               对于精确数值计算时需要用此类型
               decimal能够存储精确值的原因在于其内部按照字符串存储。
    

    验证:

    mysql> create table t1(x float(256,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
    mysql> create table t1(x float(256,30));
    ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)
    mysql> create table t1(x float(255,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t2(x double(255,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t3(x decimal(66,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
    mysql> create table t3(x decimal(66,30));
    ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65.
    mysql> create table t3(x decimal(65,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show tables;
    +---------------+
    | Tables_in_db1 |
    +---------------+
    | t1            |
    | t2            |
    | t3            |
    +---------------+
    3 rows in set (0.00 sec)
    
    
    
    mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t2 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t3 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql> select * from t1; #随着小数的增多,精度开始不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111111111111111111 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    3、日期类型

    DATE TIME DATETIME TIMESTAMP YEAR
    作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
    在这里插入图片描述

    		YEAR
                YYYY(1901/2155DATE(日期)
                YYYY-MM-DD(1000-01-01/9999-12-31TIME(时间)
                HH:MM:SS('-838:59:59'/'838:59:59'DATETIME(日期+时间)
    
                YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59timestamp(这个不用了解和datetime差不多)
    

    4、字符串类型

    (1)字符串知识点了解

    在这里插入图片描述

    注意:charvarchar括号内的参数指的都是字符的长度
    
     1. char类型:定长,简单粗暴,浪费空间,存取速度快
        字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
        存储:
            存储char类型的值时,会往右填充空格来满足长度
            例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储,可以在创建表时指定zerofill参数,使用0填充。
    
        检索:
            在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';2. varchar类型:变长,精准,节省空间,存取速度慢
        字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
        存储:
            varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
            强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
            如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
            如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
    
        检索:
            尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
    
    (2)实操演练

    char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形

    # 先了解两个函数,下面会用到!
    length:查看字节数
    char_length:查看字符数
    
    
    mysql> create table t1(x char(5),y varchar(5));
    Query OK, 0 rows affected (0.26 sec)
    
    # char存5个字符,而varchar存4个字符
    mysql> insert into t1 values('你瞅啥 ','你瞅啥 '); # 注意你瞅啥后面有个空格的
    Query OK, 1 row affected (0.05 sec)
    
    mysql> set sql_mode=''; # 没有PAD_CHAR_TO_FULL_LENGTH,就是非严格模式
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    # 在检索时char很不要脸地将自己浪费的2个字符给删掉了,装的好像自己没浪费过空间一样,而且把数据本身的空格也删除了,但是varchar很老实,存了多少,就显示多少
    mysql> select x,char_length(x),y,char_length(y) from t1; 
    +-----------+----------------+------------+----------------+
    | x         | char_length(x) | y          | char_length(y) |
    +-----------+----------------+------------+----------------+
    | 你瞅啥    |              3 | 你瞅啥     |              4 |
    +-----------+----------------+------------+----------------+
    1 row in set (0.00 sec)
    
    # 略施小计,让char现出原形
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    # 这下子char原形毕露了......
    mysql> select x,char_length(x),y,char_length(y) from t1;
    +-------------+----------------+------------+----------------+
    | x           | char_length(x) | y          | char_length(y) |
    +-------------+----------------+------------+----------------+
    | 你瞅啥      |              5 | 你瞅啥     |              4 |
    +-------------+----------------+------------+----------------+
    1 row in set (0.00 sec)
    
    
    # char类型:3个中文字符+2个空格=11Bytes utf8的一个中文字符两个字节,一个英文字母、空格都是一个字节
    # varchar类型:3个中文字符+1个空格=10Bytes
    mysql> select x,length(x),y,length(y) from t1;
    +-------------+-----------+------------+-----------+
    | x           | length(x) | y          | length(y) |
    +-------------+-----------+------------+-----------+
    | 你瞅啥      |        11 | 你瞅啥     |        10 |
    +-------------+-----------+------------+-----------+
    1 row in set (0.00 sec)
    
    (3)总结
    'InnoDB存储引擎:建议使用VARCHAR类型'
    单从数据类型的实现机制去考虑,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。
    
    但对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。
    
    # 了解其他字符串系列(效率:char>varchar>text)
    TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
    BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 
    BINARY系列 BINARY VARBINARY
    
    texttext数据类型用于保存变长的大字符串,可以组多到65535 (2**161)个字符。
    mediumtext:A TEXT column with a maximum length of 16,777,215 (2**241) characters.
    longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**321) characters.
    

    5、枚举类型与集合类型

    两个都是用于字段的值只能在给定范围中选择。区别是枚举只能单选,集合可以单选也可以多选。例如性别我们一般使用枚举类型,因为性别只能有一个。但是爱好我们一般采用集合,因为爱好可能有多个。

    1. 枚举类型(enum)
                示例:
                    CREATE TABLE shirts (
                        name VARCHAR(40),
                        size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                    );
                    INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
    
    
    
    2. 集合类型(set)
                示例:
                    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    

    验证:

    MariaDB [db1]> create table consumer( 
        -> name varchar(50),
        -> sex enum('male','female'),
        -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一
        -> hobby set('play','music','read','study') #在指定范围内,多选多
        -> );
    
    MariaDB [db1]> insert into consumer values  
        -> ('egon','male','vip5','read,study'), 
        -> ('alex','female','vip1','girl'); # girl在hobby的set集合中不存在,因此存不进去!
    
    MariaDB [db1]> select * from consumer;
    +------+--------+-------+------------+
    | name | sex    | level | hobby      |
    +------+--------+-------+------------+
    | egon | male   | vip5  | read,study |
    | alex | female | vip1  |            |
    +------+--------+-------+------------+
    
    展开全文
  • 经常会遇到这样的情况,我们在响应客户端请求的数据的时候需要对数据进行处理,比如数据库中的数据int,它可能表示某个枚举,或者其它的逻辑意义(数据库这样的设计可能从数据安全性、存储量上等角度考虑),...
  • 1、搭建数据库服务器 目录 1、搭建数据库服务器 2、把数据存储到数据库服务器上的过程?...6-3、枚举类型 : 让字段的值 在规定的范围内选择 6-4、日期时间类型什么是数据库?存储数据的仓库 ...

    1、搭建数据库服务器

     

    目录

    1、搭建数据库服务器

    2、把数据存储到数据库服务器上的过程?

    3、使用SQL (结构化查询语言)命令 管理数据库

    4、断开与数据库连接

    5、指定表的字符集 可以存储中文数据

    6、Mysql数据类型

    6-1、数值型

    6-2、字符类型

    6-3、枚举类型 : 让字段的值 在规定的范围内选择

    6-4、日期时间类型:


    什么是数据库?存储数据的仓库

    部署一台数据库,提供数据库存储服务?
     
    购买服务器 (硬件主机  云主机 )
     
    安装操作系统: Unix    Linux   Windows

     

     1、搭建数据库服务器                                                          

    1-1数据库类型
    常用的几种关系型数据库(  RDBMS )
    Mysql 、 Oracle 、 SQL server  、DB2  
    特点:按照一定的规则存储数据                                   
    常用的几种非关系型数据库(  NOSQL)
    Redis   Mongodb  Memcached
                                                                   
    Mysql的特点:
    开源且跨平台: unix  linux   windows
    支持主流的编程语言:php  java   python  ruby  perl  
    可移植性好: 系统只要有C 运行环境即可运行Mysql
    其可移植性体现如下:
    A服务器
    远程传宋Mysql数据库主目录到B服务器
    scp  -r  /usr/local/mysql/  b:/usr/local/
     
    B服务器上只需安装gcc和gcc-c++软件环境
    yum  -y  install gcc   gcc-c++
    ls /usr/local/mysql/
     
    1-2、数据库服务通常和网站服务一起使用:LAMP   LNMP
     L-----Linux  A-----Apache  N----Nginx   
     M-----Mysql  P-----PHP                                                 
     
    如购物网站  游戏网站  视频网站  论坛网站  金融网络
     
    1-3、装包、配置、起服务、查看服务信息
    软件包的来源? 官网下载  XXX    .  主.       次.               修改次数  
                             软件名      主版本    次版本   偶数为稳定版,奇数为测试版
    mysql-5.7.17.tar    
    mysql-community-server-5.7.17-1.el7.x86_64.rpm
    mysql-community-client-5.7.17-1.el7.x86_64.rpm
     
    1-3-1、装包
    rpm  -qa  | grep -i mariadb----检查有没有安装mariadb
    systemctl  stop  mariadb-----若已安装则先停服务
    rpm -e --nodeps mariadb-server-----卸载mariadb-server------   --nodeps不检查依赖关系
    rpm -e --nodeps mariadb-libs-------卸载mariadb-libs
    rm  -rf  /var/lib/mysql/*------删除/var/lib/mysql/*主目录
    rm  -rf /etc/my.cnf------删除主配置文件
    tar -xf /root/mysql-5.7.17.tar-----解压mysql-5.7.17.tar软件包组
    yum  -y  install  perl-JSON-----安装依赖包
    yum -y install  mysql-comm*     ----批量安装解压出来的mysql-community的软件
    rpm -qa | grep -i mysql---列出所有已安装的带有mysql名字的软件包
    [root@host50 ~]# rpm -qa | grep -i mysql
    mysql-community-libs-5.7.17-1.el7.x86_64
    mysql-community-embedded-compat-5.7.17-1.el7.x86_64
    mysql-community-embedded-devel-5.7.17-1.el7.x86_64
    mysql-community-server-5.7.17-1.el7.x86_64
    mysql-community-test-5.7.17-1.el7.x86_64
    php-mysql-5.4.16-42.el7.x86_64
    mysql-community-common-5.7.17-1.el7.x86_64
    mysql-community-devel-5.7.17-1.el7.x86_64
    mysql-community-libs-compat-5.7.17-1.el7.x86_64
    mysql-community-embedded-5.7.17-1.el7.x86_64
    mysql-community-client-5.7.17-1.el7.x86_64
    mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64
     
    1-3-2、修改配置文件 /etc/my.cnf
    [mysqld]
    #skip_grant_tables------略过权限限制
    #skip_networking----数据库只能被本机访问
    #secure-file_priv=/mydata---------自定义数据导入导出文件存储的目录
    1-3-3、启动服务
       30  systemctl  start  mysqld
       31  systemctl  status  mysqld
       32  ls /var/lib/mysql
       33  systemctl  enable  mysqld
     
    1-3-4、查看服务信息
    端口号 3306     ss  -utnlp | grep  mysqld
    进程 mysqld   ps  -C  mysqld

    2、把数据存储到数据库服务器上的过程?

    1 连接数据库服务器
    # grep password /var/log/mysqld.log
     
    2018-07-10T02:46:42.233732Z 1 [Note] A temporary password is generated for root@localhost: PjCJW&is,8jV  
    注意:第一次登陆的时候需要先用系统自动生成的密码,用该密码登陆后会提示您先改密码,否则什么也做不了
    ]#mysql  -hlocalhost   -uroot   -p'PjCJW&is,8jV'
    mysql> set global validate_password_policy=0;
    mysql> set global validate_password_length=6;
    mysql> alter user  root@"localhost" identified by "123456";
    mysql> show  databases;
    mysql> quit
     
    ]#mysql  -hlocalhost   -uroot   -p123456
    mysql> show  databases;


    3、使用SQL (结构化查询语言)命令 管理数据库

    3-1、创建库  相当于系统的文件夹(查看  创建  切换  删除)
    show databases;-----列出所有库名
    create database  库名;----新建库
    use  库名;-----进入某一个库
    select  database();-----查看当前在哪个库下
    show tables;----列出库下的所有表,记得先进库
    drop  database  库名;-------删掉哪一个库
     
    3-2、数据库名的命名规则:
    1.可以使用数字、字母、下划线,但不能纯数字
    2.区分大小写,且具有唯一性
    3.不可以使用指令关键字、特殊字符
     
    3-3、 创建表 ( 相当于系统文件)表必须在库里创建(创建表 查看内容  查看表结构   删除表  写入数据)

    create  table   studb.stuinfo(name   char(15),sex  char(10),age int,tel   char(11) );-----创建表
     
    desc  studb.stuinfo;----查看表结构

    select  * from studb.stuinfo;-----查看表内容
     
    insert into  studb.stuinfo  values("bob","boy",21,"8888888"),("zhaozhibin","boy",19,"66666666");---增加表内容
     
    update studb.stuinfo set sex="girl";----改表内容
     
    delete from studb.stuinfo;---删除表内容
     
    drop table stuinfo;-----删除表
    show tables;----列出所有表


    4、断开与数据库连接

    >quit;
     


    5、指定表的字符集 可以存储中文数据

    use  studb;
    create  table  studb.学生表 (姓名  char(10) , 年龄 int) DEFAULT CHARSET=utf8;----表名和字段名默认可以使用中文,但字段内容默认不能使用中文,所以必须加DEFAULT CHARSET=utf8
     
    alter  table  studb.学生表  DEFAULT CHARSET=utf8;----通过修改表结构来加上DEFAULT CHARSET=utf8选项
     
    show  create  table  学生表;-----展出创建的表结构
     


    6、Mysql数据类型

    1.数值型:工资、消费金额、身高、体重
    2.字符型:电脑品牌、姓名、住址、花名
    3.枚举类型:性别、兴趣爱好、特长
    4.日期类型:出生日期、上学时间、下班时间

     

    6-1、数值型

    整数型
    create  table t2(level  tinyint  unsigned);---tinyint小整数,unsigned只保存正数
     
    浮点类型   
    整数.小数   总宽度
    1029.33        6

    create table  t3 (pay  float(5,2));----float(5,2)小数位精确两位,总显示宽度为5,该显示宽度不会限制字段赋值的大小,但通过设置显示宽度的大小可以实现字符视觉整齐的效果,比如最大的数所占宽度为10,则设为10,不足位数的会用0补齐。
     
    (数值类型)的宽度是显示宽度,不能限制字段赋值的大小字段值的大小由类型决定,仅适用于数值类型
     
    insert  into  t3  values(1118.23);
     


    6-2、字符类型

    char (字符数)-----  定长,字符数最大255,不够指定字符时在右边用空格补齐,字符数超出时无法写入,特点,不省空间,但节省内存
    varchar( 字符数)----- 变长,字符数最大到65535,按数据实际大小分配存储空间,字符数超出时无法写入,特点省空间,浪费内存   
     
    大文本类型
    text/blob------字符数大于65535存储时使用
    /root/media/film/xxx.avi
     音频文件   图片   视频文件
     
    create  table   t5(name  char(5))
    insert into   t5  values  ("bob"),("ab");
     
    create  table   t6(name  varchar(5))
    insert into   t6  values  ("bob"),("ab");
    写入后对比效果
     
    create  table   t7  (
    gamename char(15), level smallint unsigned , pay  float(7,2) );
     
    insert into  t7  values("zbj",250,1880.22);
     
     

    6-3、枚举类型 : 让字段的值 在规定的范围内选择

    enum(值列表)  单选
    set(值列表)  多选
     
    create  table   t8  ( name  char(15),sex  enum("boy","girl","no"),likes  set("game","film","eat","sleeps") );
     
    insert into   t8  values("bob","man","it,book");
     
    搭建MySQL数据库服务器 并设置数据库管理员root用本机登陆密码为123456
     


    6-4、日期时间类型:

    目录

    2、把数据存储到数据库服务器上的过程?

    3、使用SQL (结构化查询语言)命令 管理数据库

    4、断开与数据库连接

    5、指定表的字符集 可以存储中文数据

    6、Mysql数据类型

    6-1、数值型

    6-2、字符类型

    6-3、枚举类型 : 让字段的值 在规定的范围内选择

    6-4、日期时间类型:


    年  year    YYYY   2018
    日期  date   YYYYMMDD    20180711
    时间  time   HHMMSS      083000
    日期时间    datetime      YYYYMMDDHHMMSS----当未赋值时则为null         
    timestamp     20180711093758-----当未赋值时则以当前时间赋值
     
    create  table  t1(
    name char(15),  姓名
    s_year     year,   出生年份
    birthday   date,  生日
    work       time,   上班时间
    meetting   datetime   约会时间
    );
    desc  t1;
    insert into  t1  values("pengyuyan",1990,220000,20181120,20181224203000);
     
    MySQL服务时间函数: MySQL服务内置的命令。
     
    select  now();--------------  获取系统日期时间
    select  year( now()  );------ 获取系统年份
    select  year( 20191224 );---- 获取指定时间年份
    select  month( now() );-------获取系统月份
    select  month( 20191224 );--- 获取指定时间月份
    select  day( 20191224 );----- 获取指定时间几号
    select  day( now() );-------  获取系统时间几号
    select  date( now() );------- 获取系统日期  
    select  time( now() );------- 获取系统时间
     
     insert into  t1 values("bob",year(now()),date(now()),time(151223),now());

     

    展开全文
  • 但它一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。 获取给定类型的Type引用有3种常用方式: ●使用 C# typeof 运算符。 Type t...
  • 出错的地方在 order排序 参数,因为m => m.ECategoryPropertyRelation_Id int 不能转换成object 这错误提示,但是 我换成string的字段去orderby就没错 不知道什么原因。 var Result = PropEntity....
  • 20.10 解析器说到底是什么 354 20.11 正则解析器 355 20.12 基于词法单元的解析器 356 20.13 错误处理 358 练习 359 第21章 隐式转换和隐式参数 L3. 363 21.1 隐式转换 363 21.2 利用隐式转换丰富现有类库的...
  • 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该这样做) 5.3.2 对象相等性和同一性 5.4 对象哈希码 5.5 dynamic基元类型 第6章 类型和成员基础 6.1 类型的各种成员 6.2 类型的可见性 6.2.1 友元...
  • 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该这样做) 5.3.2 对象相等性和同一性 5.4 对象哈希码 5.5 dynamic基元类型 第6章 类型和成员基础 6.1 类型的各种成员 6.2 类型的可见性 6.2.1 友元...
  • 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该这样做) 5.3.2 对象相等性和同一性 5.4 对象哈希码 5.5 dynamic基元类型 第6章 类型和成员基础 6.1 类型的各种成员 6.2 类型的可见性 6.2.1 友元...
  • 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该这样做) 5.3.2 对象相等性和同一性 5.4 对象哈希码 5.5 dynamic基元类型 第6章 类型和成员基础 6.1 类型的各种成员 6.2 类型的可见性 6.2.1 友元...
  • 6.1 什么是函数式编程 148 6.1.1 数学中的函数 148 6.1.2 不可变变量 149 6.2 Scala中的函数式编程 151 6.2.1 匿名函数、Lambda与闭包 152 6.2.2 内部与外部的纯粹性 154 6.3 递归 154 6.4 ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

枚举型字段类型是什么