zoukankan      html  css  js  c++  java
  • MySQL基础-2

    配置文件的使用

    大家发现每次进入mysql都需要进行登录操作,而且服务器的编码为Latin1,客户端的编码为GBK,这样就很容易造成乱码,所以我们就需要进行一个统一

    1. 在根目录(程序安装的路径)下创建一个配置文件,名称为my.ini

      内容为cfg格式,即section+option

    2. [mysqld] 分区为服务器端配置,修改后需要重启服务器

      [mysql] 分区为客户端配置,修改后需要进行重连

    3. 统一编码方式配置文件:

      # 客户端配置
      [client]
      user = root
      password = 你的密码
      default-character-set = utf8
      
      # 服务器端配置 需要重启服务器
      [mysqld]
      character-set-server = utf8
      

    表的分类——数据库引擎

    数据库引擎是数据库最核心的部分,地位相当于人类的心脏,它是负责存储数据的模块

    可以通过 show engines; 查看引擎

    可以看到,mysql里面有好几个引擎,但到底那个好呢?

    这个是没有定论的,每个引擎有不同的作用,我们要根据实际需求来选择合适的引擎

    • Mysql数据库默认引擎为InnoDB

    • 创建表指定引擎

      create table 名称(字段 类型 ) engine = XXXX;

    简单的表的增删改查(CRUD)

    # 插入数据
    insert into 表名 values(数据1,数据2,……); # 该方式必须保证插入的数据个数和表格字段数量一样
    
    # 选择部分字段插入
    insert into 表名(字段名称1,字段名称2)  values(数据1,数据2);  # 该方式必须保证插入的数据个数与指定的字段数量一样
    
    # 同时插入多个记录
    insert into   表名(字段名称1,字段名称2)  values(数据1,数据2),(数据1,数据2);
    
    # 查询所有记录
    select * from 表名;
    
    # 查询符合条件的字段
    select 字段 from 表名 where 条件;
    
    
    # 更新所有的记录
    uptade 表名 set 字段1=新的值1,字段2=新的值2;
    
     # 更新符合条件的记录
    update 表名 set 字段1=新的值1,字段2=新的值2 where 条件;
    
    # 删除所有记录
    delete from 表名;
    
    # 删除满足条件的记录
    delete from 表名 where 条件;
    

    创建表的完整写法

    create table 表名(字段名称1 字段类型[(长度) 约束],字段名称1 字段类型[(长度) 约束]……) charset utf8;

    Mysql中的数据类型

    数字类型

    • 注意:

      整型:
      1. 默认情况下为有符号的,需要设置为无符号要在增加unsigned约束

        alter table 表名 modify 字段 数据类型 unsigned;

        create table 表名(字段 数据类型 unsigned)

      2. mysql 5.6 版本在默认情况下,为非加严模式,如果数据类型超过范围,就会自动取最大值,这样就不能保证数据的安全,所以可以在配置中设置为加严模式,或者临时设置sql_mode,但退出后又会恢复非加严模式

        # 查看当前的sql模式
        
        select @@sql_model   # @ 表示全局变量   @@ 表示局部变量
        +---------------------+
        | @@sql_mode          |
        +---------------------+
        | STRICT_TRANS_TABLES |    # 当前为非加严模式
        +---------------------+
        
        # 1.临时设置
        set  @@sql_mode = " STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
        select @@sql_model
        +--------------------------------------------+
        | @@sql_mode                                 |
        +--------------------------------------------+
        | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |   # 加严模式
        +--------------------------------------------+
        
        # 2.修改配置,永久有效
        [mysqld]
        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
        
      3. 指定长度

        比如int(5),表示数据最小长度为5,如果数据不足5位,默认用空填充,如果要用0填充,需要增加zerofill约束

        create table test(x int(5) zerofill);
        insert into test values(2);
        insert into test values(201780);   # 证明5并不是限制最大长度的
        select *from test;
        +--------+
        | x      |
        +--------+
        |  00002 |
        | 201780 |
        +--------+
        
      浮点型
      1. 数据类型(M,D) 表示整数位最大长度为M-D,超出则会报错,小数位最大长度为D,如果小数位超过了,则会自动进行四舍五入

        create table test(x float(5,3));
        insert into test values(2.56789);
        Query OK, 1 row affected (0.21 sec)
        select *from test;
        +-------+
        | x     |
        +-------+
        | 2.568 |
        +-------+
        
        insert into test values(100);   # 报错,最大只能为99.999
        ERROR 1264 (22003): Out of range value for column 'x' at row 1
        
      2. float类型 不需要指定位数,最大只能精确到小数点后5位

        double类型 不需要指定位数,最大只能精确到小数点后15位

        decimal类型 必须指定位数,长度最大为65,小数点后面最长为30

    字符串类型

    类型 大小 用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据
    1. char

      定义时需要指定字符串长度,默认为1,比如char(10),表示最大只能有10个字符,超出长度自动取前10个字符,而少于10个字符的自动在前面补足空格

      • 优点:读取速度快
      • 缺点:浪费空间
    2. varchar

      定义时也需要指定字符串长度,但是和char的区别就是varchar不会自动补空格,而且varcher最终占⽤的空间为实际内容所占字节数+1,因为需要一个bit 存储字符长度

      • 优点:节省空间
      • 存取速度慢一些
      char(4) 存储需求 varcher(4) 存储需求
      ‘’ ' ' 4个字节 '' 1个字节
      ‘ab' 'ab ' 4个字节 'ab' 3个字节
      'abcd' 'abcd 4个字节 'abcd' 5个字节
      'abcdefg' 'abcd' 4个字节 'abcd' 5个字节
    3. text

      存放长度较大的字符串

    4. blob

      存放的是二进制

    枚举和集合

    类型 大小
    ENUM 对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。
    SET 1-8个成员的集合,占1个字节 9-16个成员的集合,占2个字节 17-24个成员的集合,占3个字节 25-32个成员的集合,占4个字节 33-64个成员的集合,占8个字节
    1. 枚举是提前规定一个范围 你的值只能是其中之一 多选一

    2. 集合是提前规定一个范围 你的值可以是其中的多个 多选多

      集合在插入数据时 ,多个值之前用逗号隔开 但他们必须包含在同一个字符串内!

      create table t10 (name char(20),gender enum('female','male'));
      Query OK, 0 rows affected (0.01 sec)
      
      # 选择enum('female','male')中的一项作为gender的值,可以正常插入
      insert into t10 values ('nick','male');
      Query OK, 1 row affected (0.00 sec)
      
      # 不能同时插入'male,female'两个值,也不能插入不属于'male,female'的值
      insert into t10 values ('nick','male,female');
      ERROR 1265 (01000): Data truncated for column 'gender' at row 1
      
      create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车'));
      Query OK, 0 rows affected (0.01 sec)
      
      # 可以任意选择set('抽烟','喝酒','烫头','翻车')中的项,并自带去重功能
      insert into t11 values ('tank','烫头,喝酒,烫头');
      Query OK, 1 row affected (0.01 sec)
      
      select * from t11;
      +------+---------------+
      | name | hobby        |
      +------+---------------+
      | tank | 喝酒,烫头     |
      +------+---------------+
      row in set (0.00 sec)
      
      # 不能选择不属于set('抽烟','喝酒','烫头','翻车')中的项,
      insert into t11 values ('jason','烫头,翻车,看妹子');
      ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
      

    时间和日期

    类型 大小 (字节) 范围 格式 用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 年月日
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时分秒
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 0000-00-00 00:00:00/9999-12-31 23:59:59 YYYY-MM-DDHH:MM:SS 年月日时分秒
    TIMESTAMP 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDDHHMMSS 混合日期和时间值,时间戳
    1. date/time/datatime类型

      create table t4 (d date,t time,dt datetime);
      Query OK, 0 rows affected (0.02 sec)
      
      desc t4;
      +-------+----------+------+-----+---------+-------+
      | Field | Type     | Null | Key | Default | Extra |
      +-------+----------+------+-----+---------+-------+
      | d     | date     | YES  |     | NULL    |       |
      | t     | time     | YES  |     | NULL    |       |
      | dt    | datetime | YES  |     | NULL    |       |
      +-------+----------+------+-----+---------+-------+
      rows in set (0.01 sec)
      
      insert into t4 values (now(),now(),now());
      Query OK, 1 row affected, 1 warning (0.01 sec)
      
      select * from t4;
      +------------+----------+---------------------+
      | d          | t        | dt                  |
      +------------+----------+---------------------+
      | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
      +------------+----------+---------------------+
      row in set (0.00 sec)
      
      insert into t4 values (null,null,null);
      Query OK, 1 row affected (0.01 sec)
      
      select * from t4;
      +------------+----------+---------------------+
      | d          | t        | dt                  |
      +------------+----------+---------------------+
      | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
      | NULL       | NULL     | NULL                |
      +------------+----------+---------------------+
      rows in set (0.00 sec)
      
    2. timestamp类型

      create table t5 (id1 timestamp);
      Query OK, 0 rows affected (0.02 sec)
      
      desc t5;
      +-------+-----------+------+-----+-------------------+-----------------------------+
      | Field | Type      | Null | Key | Default           | Extra                       |
      +-------+-----------+------+-----+-------------------+-----------------------------+
      | id1   | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
      +-------+-----------+------+-----+-------------------+-----------------------------+
      row in set (0.00 sec)
      
      # 插入数据null,会自动插入当前时间的时间
      insert into t5 values (null);
      Query OK, 1 row affected (0.00 sec)
      
      select * from t5;
      +---------------------+
      | id1                 |
      +---------------------+
      | 2018-09-21 14:56:50 |
      +---------------------+
      row in set (0.00 sec)
      
      #添加一列 默认值是'0000-00-00 00:00:00'
      alter table t5 add id2 timestamp;
      Query OK, 0 rows affected (0.02 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      
      show create table t5 G;
      *************************** 1. row ***************************
             Table: t5
      Create Table: CREATE TABLE `t5` (
        `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      row in set (0.00 sec)
      
      ERROR: 
      No query specified
      
      # 手动修改新的列默认值为当前时间
      alter table t5 modify id2 timestamp default current_timestamp;
      Query OK, 0 rows affected (0.02 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      
      show create table t5 G;
      *************************** 1. row ***************************
             Table: t5
      Create Table: CREATE TABLE `t5` (
        `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        `id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      row in set (0.00 sec)
      
      ERROR: 
      No query specified
      
      insert into t5 values (null,null);
      Query OK, 1 row affected (0.01 sec)
      
      select * from t5;
      +---------------------+---------------------+
      | id1                 | id2                 |
      +---------------------+---------------------+
      | 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
      | 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
      +---------------------+---------------------+
      rows in set (0.00 sec)
      
    3. year类型

      create table t7 (y year);
      Query OK, 0 rows affected (0.02 sec)
      
      insert into t7 values (2018);
      Query OK, 1 row affected (0.00 sec)
      
      select * from t7;
      +------+
      | y    |
      +------+
      | 2018 |
      +------+
      row in set (0.00 sec)
      

      注意:上述时间,两位数0-69 翻译为 2000-2069 70-99 翻译为1790-1999

  • 相关阅读:
    记周日一次故障意外
    每周一坑-【3月第1周】
    关于计划任务的一个小需求-优化篇
    400篇博客的一个里程碑
    关于计划任务的一个小需求-实现篇
    关于计划任务的一个小需求
    微服务优雅停机研究
    NSUInteger设为负数
    Mac上运行第一个Flutter项目
    Vue filtersfilter、computed、methods、watch对比
  • 原文地址:https://www.cnblogs.com/Hades123/p/11180585.html
Copyright © 2011-2022 走看看