MySQL数据类型与操作

内容提要:

  1. 建表完整语法规范(create table 表格(字段名1 类型 (宽度) 约束条件))

  2. MySQL数据库数据类型(整型、浮点型、字符类型(char与varchar)、日期类型、枚举与集合)

  3. 约束条件(primary key、unique key、not null、foreign key)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、创建表的完整语法

语法:

create table 表名(

字段名1 类型 (宽度) 约束条件,

字段名2 类型 (宽度) 约束条件,

字段名3 类型 (宽度) 约束条件);

特别注意:

  • 在同一张表中,字段名不能相同
  • 宽度和约束条件为可选项,但是字段名和类型必须有
  • 最后一个字段添加完毕后后面不能加逗号!

补充:1、这里的宽度是对存储数据的一种限制,在不同MySQL版本里面可能会出现不同的结果,这里只是不同版本的默认约束条件不一样导致,在最新版本5,7中如果输入数据

宽度超出限制,则会报错。

   2、类型与约束条件的区别:类型是限制字段必须以什么样的数据类型存储,二约束条件是在这一类型之上添加一种额外的限制。

二、MySQL基本数据类型

  • 整型(int)

    • 分类:tinyint  smallint  mediumint  int  bigint
    • 作用:储存年龄、等级、id、各种号码等
    • 类型存储范围:
    • 验证整型字段有无符号及范围
      int类型默认是有符号的,也就是说默认支持输入负数到正数
      mysql> reate table t1(id tinyint);
      mysql> insert into t1 values(128),(-129);
      #结果:ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
      # 因为tinyint类型最大正整数限制为127,输入128超出范围。报错
      
      create table t2(id tinyint unsigned);  # unsigned表示这里类型设置为无符号(无正负号)
      mysql> insert into t2 values (0),(255);
      #这里类型约束为无符号,所以输入负数就会报错,输入超过255的数也会报错。tinyint无符号范围是0-255。
      
      以下同理:
      create table t3(id int unsigned);
      mysql> insert into t3 values (4294967296);
      ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
      mysql> insert into t3 values (4294967295);
      Query OK, 1 row affected (0.01 sec)
      
      强调:对于整型来说,数据类型之后的宽度并不是存储限制,而是现实宽度限制,所以在创建表的时候,
      如果字段采用的是整型类型,完全无需指定显示宽度,因为默认的显示宽度(11),一般情况下,就足够显示完整的数据。        
  • 浮点型(分为float、double、decimal)

    • 应用场景:身高、体重、薪资
    • 字符限制特点(5,3),前一位表示所有的位数,后一位表示小数个数
    • 区别对比:

      # 存储限制
      float(255,30)
      double(255,30)
      decimal(65,30)
      
      # 精确度验证
      mysql> create table t9(x float(255,30));
      mysql> create table t10(x double(255,30));
      mysql> create table t11(x decimal(65,30));
      
      mysql> insert into t9 values(1.111111111111111111111111111111);
      mysql> insert into t10 values(1.111111111111111111111111111111);
      mysql> insert into t11 values(1.111111111111111111111111111111);
      mysql> select * from t9;
      +----------------------------------+
      | x                                |
      +----------------------------------+
      | 1.111111164093017600000000000000 |
      +----------------------------------+
      1 row in set (0.00 sec)
      
      mysql> select * from t10;
      +----------------------------------+
      | x                                |
      +----------------------------------+
      | 1.111111111111111200000000000000 |
      +----------------------------------+
      1 row in set (0.00 sec)
      
      mysql> select * from t11;
      +----------------------------------+
      | x                                |
      +----------------------------------+
      | 1.111111111111111111111111111111 |
      +----------------------------------+
      1 row in set (0.00 sec)
      
      从上面的查询创建的表中数据可以看出:
      精度对比:decimal的精度最高,其次是double,最后是float,
      但是就算是精度最低的float它的精度也有16位,所以一般使用完全能够应付99%的数据场景。
  • 字符类型(char定长与varchar变长)

    • 作用:姓名、地址、描述类信息
    • 理解通过实际使用来描述:

      char:
      mysql> create table t12(name char(4));
      mysql> insert into t12 values (‘hello‘);
      ERROR 1406 (22001): Data too long for column ‘name‘ at row 1 # 超出限制范围会报错。
      mysql> insert into t12 values (‘hell‘);
      Query OK, 1 row affected (0.01 sec)
      mysql> insert into t12 values (‘he‘);
      Query OK, 1 row affected (0.00 sec)
      mysql> select * from t12;
      +------+
      | name |
      +------+
      | hell |         # 4个字符正好填满
      | he   |         #不够4个字符空格补全
      +------+
      --------------------------------------------------------------
      varchar:
      mysql> create table t13(name varchar(4));
      mysql> insert into t13 values (‘hello‘);
      ERROR 1406 (22001): Data too long for column ‘name‘ at row 1         # 超出范围,报错
      mysql> insert into t13 values (‘hell‘);
      Query OK, 1 row affected (0.00 sec)
      mysql> insert into t13 values (‘he‘);
      Query OK, 1 row affected (0.01 sec)
      mysql> select * from t13;
      +------+
      | name |
      +------+
      | hell |     # 正好4个,填满
      | he   |    # 不够4个,按实际宽度占位。(这里看不出来,但是一定要记住,varchar是变长,所以不够4个肯定按实际宽度存储)
      
      +------+
      #####
      TIP:
      select char_length(name) from t12
      select char_length(name) from t13  # 仍然无法查看到真正的结果
      
      """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
      # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
      set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
      # 退出客户端重新登陆
      select char_length(x) from t12; #4
      select char_length(y) from t13; #1
      
      # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
      ####
    • char 与 varchar 的使用区别
      • name char(5)

        • 优点:浪费空间,每个name信息都是按照5个字符存,这样如果不够5个的也会用空格补全,造成存储空间浪费
        • 缺点:存取速度很快,因为存储数据的结构固定,所以存取速度快。
        • egon alex lxx  jxx  txx  存用5个字符5个字符存,取的话也是5个字符为一部分取,准确快捷
      • name varchar(5)
        • 缺点:存取速度慢,每个name信息按照可变长的形式去存,同时存的时候要在前面加入该字符长度的报头,一并存入,取的时候按照报头里的长度数据去取数据,比char多了好几步,所以存取数据相比较char会慢些。
        • 优点:节省空间,通过可变长来存入,加上报头数据也不会造成空间的太多浪费
        • 1bytes+egon 1bytes+alex 1bytes+lxx  1bytes+jxx  1bytes+txx
  • 时间类型

    • 分类:

      • date:2019-05-13
      • time:11:11:11
      • datetime:2019-05-13 11:11:11
      • year:2019
    • 测试:

      mysql> create table stu(id int,name char(16),birth_d date,study_time time,reg_time datetime);  # 创建表
      mysql> insert into stu values(1,‘jason‘,‘2019-05-09‘,‘11:11:11‘,‘2019-11-11 11:11"11‘);   #插入表数据
      Query OK, 1 row affected (0.00 sec)
      
      mysql> select * from stu;   # 显示表内容
      +------+-------+------------+------------+---------------------+
      | id   | name  | birth_d    | study_time | reg_time            |
      +------+-------+------------+------------+---------------------+
      |    1 | jason | 2019-05-09 | 11:11:11   | 2019-11-11 11:11:11 |
      +------+-------+------------+------------+---------------------+
      1 row in set (0.00 sec)
  • 枚举与集合类型:

    • 分类

      • 枚举enum 多选一
      • 集合set 多选  一或多
    • 示例:

      enum枚举:
      mysql> create table usr(id int,name char(16),gender enum(‘male‘,‘female‘,‘others‘));
      Query OK, 0 rows affected (0.05 sec)
      mysql> insert into usr values(1001,‘jsson‘,‘xxx‘);
      ERROR 1265 (01000): Data truncated for column ‘gender‘ at row 1
      mysql> insert into usr values(1001,‘jsson‘,‘male‘);
      Query OK, 1 row affected (0.01 sec)
      mysql> insert into usr values(1002,‘egon‘,‘female‘);
      Query OK, 1 row affected (0.01 sec)
      mysql> select * from usr;
      +------+-------+--------+
      | id   | name  | gender |
      +------+-------+--------+
      | 1001 | jsson | male   |
      | 1002 | egon  | female |
      +------+-------+--------+
      2 rows in set (0.00 sec)
      -----------------------------------------------------------------
      set集合:
      mysql> create table tea(id int,name char(16),gender enum(‘male‘,‘female‘,‘other‘),hobby set(‘read‘,‘sleep‘,‘dbj‘));
      Query OK, 0 rows affected (0.04 sec)
      mysql> insert into tea values(10011,‘egon‘,‘female‘,‘read,dbj‘);
      Query OK, 1 row affected (0.01 sec)
      mysql> insert into tea values(10012,‘alex‘,‘male‘,‘dbj‘);
      Query OK, 1 row affected (0.05 sec)
      mysql> select * from tea;
      +-------+------+--------+----------+
      | id    | name | gender | hobby    |
      +-------+------+--------+----------+
      | 10011 | egon | female | read,dbj |
      | 10012 | alex | male   | dbj      |
      +-------+------+--------+----------+
      2 rows in set (0.00 sec)
  • 约束条件

    • 类型

      PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
      FOREIGN KEY (FK)    标识该字段为该表的外键
      NOT NULL            标识该字段不能为空
      UNIQUE KEY (UK)     标识该字段的值是唯一的
      AUTO_INCREMENT      标识该字段的值自动增长(整数类型,而且为主键)
      DEFAULT             为该字段设置默认值
      UNSIGNED            无符号
      ZEROFILL            使用0填充not null + defaultnot null:不为空
      
      • not null + default

      • mysql> create table us(id int,name char(16));
        Query OK, 0 rows affected (0.05 sec)
        
        mysql> insert into us values (1,null);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> desc us;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | id    | int(11)  | YES  |     | NULL    |       |
        | name  | char(16) | YES  |     | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        
        mysql> delete from us where id=1;   # 先清空存入的null数据
        Query OK, 1 row affected (0.01 sec)
        
        mysql> alter table us modify name char(16) not null; # 将name输入的数据限制为非空
        Query OK, 0 rows affected (0.05 sec)
        Records: 0  Duplicates: 0  Warnings: 0
        
        mysql> desc us;  # 查看表格式:
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | id    | int(11)  | YES  |     | NULL    |       |
        | name  | char(16) | NO   |     | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        
        mysql> insert into us values(002,null);  # 此时再输入null就会报错了,因为我们限制了name必须输入未非空的字符。
        ERROR 1048 (23000): Column ‘name‘ cannot be null
        default  默认值
        mysql> create table st(id int,name char(16) not null,gender enum(‘male‘,‘female‘) default ‘male‘);  # 为gender字段设置默认值‘male,前面指定输入字段不包含gender时候,这时候的默认字段名就会生效。
        Query OK, 0 rows affected (0.03 sec)
        
        mysql> insert into st(id,name) values (1001,‘lxx‘);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> select * from st;
        +------+------+--------+
        | id   | name | gender |
        +------+------+--------+
        | 1001 | lxx  | male   |
        +------+------+--------+
        1 row in set (0.00 sec)
      • unique  某个字段对应的值在当前表中是唯一的,不能重复

        ###单列唯一:
        mysql> create table user1(id int unique,name char(16));
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> insert into user1 values (1,‘js‘),(1,‘eg‘); #报错
        ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘id‘
        mysql> insert into user1 values (1,‘js‘),(2,‘eg‘); #不报错
        Query OK, 2 rows affected (0.00 sec)
        Records: 2  Duplicates: 0  Warnings: 0
        
        ###联合唯一:多个字段如果同时有相同的输入时,会报错
        mysql> create table server(id int,ip char(16),port int,unique(ip,port));
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> desc server;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | id    | int(11)  | YES  |     | NULL    |       |
        | ip    | char(16) | YES  | MUL | NULL    |       |
        | port  | int(11)  | YES  |     | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        3 rows in set (0.00 sec)
        
        mysql> insert into server values (1,‘127.0.0.1‘,8080);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> insert into server values (2,‘127.0.0.1‘,8080);   #ip和port都相同,报错
        ERROR 1062 (23000): Duplicate entry ‘127.0.0.1-8080‘ for key ‘ip‘  
        
        mysql> insert into server values (2,‘127.0.0.2‘,8080); # 仅仅是port相同不会报错
        Query OK, 1 row affected (0.00 sec)
        
        mysql> insert into server values (3,‘127.0.0.1‘,8081); #仅仅是ip相同也不会报错
        Query OK, 1 row affected (0.00 sec)
        
        mysql> select * from server;  查看结果:
        +------+-----------+------+
        | id   | ip        | port |
        +------+-----------+------+
        |    1 | 127.0.0.1 | 8080 |
        |    2 | 127.0.0.2 | 8080 |
        |    3 | 127.0.0.1 | 8081 |
        +------+-----------+------+
        3 rows in set (0.00 sec)
      • primary key+auto_increment(mysql数据类型及约束条件的重点内容,必须要掌握)

        # 单从约束角度来说 primary key 等价于not null + unique
        mysql> create table tt1(id int primary key);  # 设置id主键唯一
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> desc tt1;
        +-------+---------+------+-----+---------+-------+
        | Field | Type    | Null | Key | Default | Extra |
        +-------+---------+------+-----+---------+-------+
        | id    | int(11) | NO   | PRI | NULL    |       |
        +-------+---------+------+-----+---------+-------+
        1 row in set (0.00 sec)
        
        mysql> insert into tt1 values (1),(1);   # 主键不唯一,报错
        ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘PRIMARY‘
        mysql> insert into tt1 values (1),(2);  #唯一,不报错
        Query OK, 2 rows affected (0.00 sec)
        Records: 2  Duplicates: 0  Warnings: 0
        -----------------------------------------------------------------
        重点内容:
        一、一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非null且unique的字段自动将其设为主键。
        mysql> create table ts1(id int,name char(16),age int not null unique,addr char(16) not null unique)engine=innodb;
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> desc ts1;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | id    | int(11)  | YES  |     | NULL    |       |
        | name  | char(16) | YES  |     | NULL    |       |
        | age   | int(11)  | NO   | PRI | NULL    |       |
        | addr  | char(16) | NO   | UNI | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        ------------------------------------------------------------------
        二、如果表里面没有指定的任何可以设置的主键字段,那么innodb存储引擎会采用自己的默认的一个隐藏的字段作为主键,隐藏意味着你在查询的时候无法根据主键字段加速查询了
        ------------------------------------------------------------------
        三、一张表中通常都应该有一个id字段,并且通常将id字段设为主键
        ------------------------------------------------------------------
        额外知识点:
        #联合主键:与联合唯一字段一个道理,即多个字段联合起来作为表的主键,本质上将多个字段总体看为一个主键
        mysql> create table ts2(ip char(16),port int,primary key(ip,port));
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> desc ts2;     # 2个字段合为一个主键。
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | ip    | char(16) | NO   | PRI | NULL    |       |
        | port  | int(11)  | NO   | PRI | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        auto_increment  自增约束
        mysql> create table ts3(id int primary key auto_increment,name char(16));
        Query OK, 0 rows affected (0.05 sec)
        
        mysql> insert into ts3(name) values (‘jason‘),(‘alex‘),(‘lxx‘);    #只输入name字段信息
        Query OK, 3 rows affected (0.01 sec)
        Records: 3  Duplicates: 0  Warnings: 0
        
        mysql> select * from ts3;   # 查看自增结果
        +----+-------+
        | id | name  |
        +----+-------+
        |  1 | jason |
        |  2 | alex  |
        |  3 | lxx   |
        +----+-------+
        ------------------------------------------------------------------
        补充:
        接着上面的例子,如果我将其中一个字段比如lxx,删除后再添加字段,会出现:
        mysql> delete from ts3 where id=3;
        Query OK, 1 row affected (0.01 sec)
        
        mysql> insert into ts3(name) values (‘xxxx‘);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> select * from ts3;
        +----+-------+
        | id | name  |
        +----+-------+
        |  1 | jason |
        |  2 | alex  |
        |  4 | xxxx  |       # 此时序号居然还是接着自增。
        +----+-------+
        3 rows in set (0.00 sec)
        
        tip:如果要清楚继续自增,从头开始的话,就必须清空表,才行。
        mysql> truncate ts3;  # 将整张表重置,id重新从0开始记录。
        Query OK, 0 rows affected (0.03 sec)
        
        mysql> insert into ts3(name) values (‘eeeee‘);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> select * from ts3;
        +----+-------+
        | id | name  |
        +----+-------+
        |  1 | eeeee |
        +----+-------+  

-------------------------------------------------------------------------------------------------------------------------------------------

  • 严格模式补充

  我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global  # 全局有效

set global sql_mode =‘STRICT_TRANS_TABLES‘
# 修改完之后退出当前客户端重新登陆即可

  

  

原文地址:https://www.cnblogs.com/suguangti/p/10857905.html

时间: 2024-10-08 07:42:24

MySQL数据类型与操作的相关文章

MySQL数据类型+简单操作

数据类型 数值型整数int(m) 四个字节(-21亿~21亿) ---java:intbigint(m) 八个字节(18次方) ---java:long浮点数float(m,d)单精度浮点数 8位精度四个字节 m总个数 d小数个数 ---java:floatdouble(m,d)双精度浮点数 16位精度八个字节 m总个数 d小数个数 ---java:float定点数浮点型在数据库中永远存放的是近似值,而定点型存放的是精确值decimal(m,d)m<65 d<30且d<m m是总个数d是

21分钟 MySQL 入门教程 &amp;&amp; mysql数据类型

转自:http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html#c1 http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html 21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据类型 五.使用MySQL数据库 登录

Java数据类型和MySql数据类型对应表(转)

Java数据类型和MySql数据类型对应表 java mysql 数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1        

Java数据类型和MySql数据类型对应表

Java数据类型和MySql数据类型对应表: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNED java.lang.Long 4 TI

mysql数据类型分析总结

MySQL数据类型 数值值 数值是诸如48或193.62这样的值.MySQL支持说明为整数(无小数部分)或浮点数 (有小数部分)的值.整数可按十进制形式或十六进制形式表示. (字符)串值 串是诸如"Madison,Wisconsin"或"patientshowsimprovement"这样的值.既可用单引号也可用双引号将串值括起来. 序列说明 \0NUL(ASCII0) \n新行 \'单引号 \r回车 \"双引号 \t制表符 \b退格 \\反斜杠 日期和时

搞定linux上MySQL编程(二):MySQL语法基础操作

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] sql(structured query language)是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统. sql语言包含3部分: 1. 数据定义语言(DDL),用于定义和管理对象,例如数据库.数据表以及试图等.例如create.drop.alter等语句. 2. 数据操作语言(DML),用于操作数据库中数据,例如select. insert

mysql对表的操作

mysql对表的操作 表的概念 表示包含数据库中所有数据的数据库对象.表中的数据库对象包含列.索引.触发器.其中触发器是指用户定义的事务命令集合,当对一个表中的数据进行插入.更新或者删除时,这组命令就会自动执行,可以确保数据的安全性和完整性. 创建表 create table tableName( 属性名 字段类型, 属性名 字段类型, -- 属性名 字段类型 ); 最后一个字段类型后面没有逗号,整个语句的小括号后边有分号. 例如:创建一个数据库,并且创建一张表: create database

mysql数据库从删库到跑路之mysql数据类型

一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql数据类型概览 1 数字(默认都是有符号,宽度指的是显示宽度,与存储无关) tinyint int bigint:个数,年龄,id,qq号,手

Java数据类型和MySql数据类型对应一览

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1               INTEGER 4 INTEGER UNSIGNED java.la