1.创建表的完整语法

create table 表名(
字段名称 数据类型[(长度) 约束条件],
字段名称 数据类型[(长度) 约束条件]
)
 
必须的:字段名  数据类型  表名
可选的:长度 约束条件 长度用于设置数据的长度 数据类型也是一种约束
约束指的是除了数据类型外的额外的规范 如果添加的数据超过了指定的长度范围,超出范围的就丢弃; 注意: 字段名 和 表名 库名 都不能是mysql的关键字 比如select from not.....

2.数据类型

为什么需要将数据分类?

  1.为了描述事物 更加准确
2.描述起来更方便
3.节省内存空间
1 a 你
utf8 下 5个字节
1 a b c
unicode 6个字节

mysql支持的数据类型:
        整型

               ***      ***     ***    *****   ***
tinyint smallint mediumint int bigint
字节数: 1(255) 2 3 4 8   

       

默认情况下整型是有符号的 需要用一个二进制位存储符号
给整型加上 约束 unsigned来表示无符号     create table t7(id tinyint unsigned);
如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255
如果有符号 例如 tinyint 保存-1280 其实存的是-128 是最小值 修改严格模式:
以上特性的出现是因为 mysql处于非严格模式
查看当前模式 show variables like "sql_mode";

修改为严格模式  set global sql_mode = "STRICT_TRANS_TABLES";
        严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式!

  设置完严格模式之后,重启客户端:

因为带符号得tinyint最大支持127,所以直接报错

在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库

怎么选择: 得根据实际情况来判断,能够保存你的数据的最小类型

长度限制对于整型的意义:
            create table t10(id int(1));
            insert into t10 value(5555555);
            select *from t10;
            发现这个数也存储成功

说明 这里长度指的不是存储容量限制
            而是显示的宽度
            如果你的数据超过了显示宽度 有几个显示几个
            如果不足 则补全到指定长度  得告诉它用什么来补全
            create table t13(id int(10) zerofill);

总结 不是容量限制 而是 显示宽度
                要限制显示宽度
                 1.创建表时 给整型加上宽度
                 2.加上zerofill约束

浮点型: 小数型

分类: float *****  double **** decimal  *****
字节数:     4          8        不确定(手动指定)

给浮点设置宽度限制
float(m,d)
double(m,d)
decimal(m,d)

长度说明 *****
m表示 这个浮点数整体的长度
d表示 小数部分的长度
例如: float(5,3)  最大值: 99.999

区别 *****
相同点: 小数部分最大长度都是30
        float和double的最大长度为255
不同点: decimal的整体最大长度65
        精度不同
        double 比 float 精度高
        decimal 是准确的 不会丢失精度

如何选择:你对精确度要求高你就使用 decimal

字符型
分类
char  定长,简单粗暴,浪费空间,存取速度快
varchar 变长,精准,节省空间,存取速度慢

char类型的长度是固定 无论你存储的数据有多长 占用的容量都一样
char(3)  存储的数据为 "a"   在硬盘保存的数据还是占3字符长度  实际保存的是"a  "
varchar 长度是可变的 存储的数据有多长就占用多长
varchar(3)  存储的数据为 "a" 在硬盘保存的数据还是占1字符长度  实际保存的是"a"
yxx exx lxx zxx cx wxx   char(3)
(1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx)  varchar(3)
如果是可变长度 则有问题 不知道数据从哪里开始到哪里结束  所以需要有一个位置保存数据的长度
vharchar 能支持的最大长度是65535  用于保存数据长度的数据最长两个bytes

如果是char类型  如果你的数据不足指定长度 就在后面用空格补全

验证:
    使用一个 char_length的函数 可以查看字符的长度
    create table t18(a char(4),b varchar(4));
    insert into t18 value("x","x");
    select char_length(a),char_length(b) from t18;
    两个字段的长度都为1

结论:
    这是因为 mysql在存储时 自动加上的空格 对使用者而言是没有意义的 所以mysql自动帮你处理掉空格了
    我们可以设置sql模式 来让它现出原形
    set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
    设置完成后重启msyql 再次查询长度

注意:
    当你在执行这样的查询语句时  mysql会自动将参数末尾的空格去除
    select *from t18 where  name = "a"

当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
    select *from t18 where  name like "a";
        % 任意个数的任意字符
        _ 1个任意字符

如何选择
    char
        存取效率高
        浪费存储空间
    varchar
        存取效率低于char
        节省存储空间
    使用起来感受不到区别 通常用的是char

char和varchar 长度都比较小 最大就是65535

大文本类型:
    TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT     文本是带有编码
    BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码

二进制类型: 用于存储多媒体数据 比如视频   但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址
    BINARY系列 BINARY VARBINARY    存储二进制数据

分类
time   时分秒   HH:MM:SS

year   年份     
date   日期  年月日   
datetime 日期加时间 年月日 时分秒     年份最大是9999    
timestamp 时间戳  从1970-1-1开始算    年份最大是2037

共同点: 时间的存取通过字符串类型
        都可以使用now()函数来插入当前时间

datetime 和 时间戳都能够表示日期和时间
不同之处是: 年份最大范围不同
            时间戳可以为空 代表当前时间
            时间戳在你更新记录时 会自动更新为当前时间

枚举  
    用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他
    enum("man","woman","other")

总结: 枚举中只能是字符串类型
          添加的数据只能是已经出现在枚举中的值
          你的值只能是其中的一个
          你也可以使用枚举值的序号来插入值 从1开始
           多选1

集合 
    用于描述一堆数据  比如你的兴趣爱好
    set("watch movie","listen music","play game")

总结:集合中的数据 只能是字符串
         添加的数据只能是已经出现在集合中的值
         你的值可以是其中的任意几个
         你也可以使用枚举值的序号来插入值 从1开始   但是只能给一个序号
           多选多

原文链接:https://www.cnblogs.com/zhangshengxiang/p/9636556.html

mysql建表语句和数据类型的更多相关文章

  1. 三种常用的MySQL建表语句(转)

    MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1(    ...

  2. MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...

  3. mysql和oracle建表语句以及数据类型的区别

    1.mysql和oracle建表语句的区别 mysql DROP TABLE IF EXISTS `order`;CREATE TABLE `order` (  `id` int(11) NOT NU ...

  4. MySQL建表语句+添加注释

    1.建表+注释 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号', name ) COMMENT '姓名', a ...

  5. MySQL建表语句的一些特殊字段

    这里的字段会不断更新 unsigned 这个字段一般在建表的时候写在Id上,用来表示不分正负号 tinyint 这个字段如果设置为UNSIGNED类型,只能存储从0到255的整数,不能用来储存负数. ...

  6. Python导出MySQL数据库中表的建表语句到文件

    为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息 # -*- coding: utf-8 -*- import os i ...

  7. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  8. sqlite建表语句(特别是外键问题)

    原创  sqlite建表语句(特别是外键问题) 下面图表示两个表关系: //表1User_invitecreate table User_invite(Invite_id INTEGER PRIMAR ...

  9. ORACLE 建表语句(表名及字段名大写)

    ORACLE建表时如果表名或者字段名存在大小写同时存在的情况下,默认为区分大小写,此时在select/updata等操作时需要在表名或者字段名上添加双引号,否则会报"视图不存在"的 ...

随机推荐

  1. R Akaike information criterion,AIC,一个越小越好的指标

    Akaike information criterion,AIC是什么?一个用来筛选模型的指标.AIC越小模型越好,通常选择AIC最小的模型.第一句话好记,第二句话就呵呵了,小编有时候就会迷惑AIC越 ...

  2. 玩个JAVA爬虫,没想玩大

    想玩个爬虫,爬些数据玩玩,不成想把自己玩“进去”了 想爬这个新浪的股票 大额交易页面 本以为用 HttpClient 直接爬链接,结果发现这个页面中,翻页数据压根就是动态赋值的,根本没有,那我根本无法 ...

  3. 040、Java中逻辑运算之短路与运算“&&”

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. SQLlite的olestr

    关于SQLite的connection string说明:http://www.connectionstrings.com/sqlite/ SQLite GUI客户端列表:http://www.sql ...

  5. [题解] LuoguP5666 树的重心

    这个题......确实是CSPNOIP题qwq 感觉猜到一个性质就差不多了,首先,对于一棵树,随便拎一个节点\(rt\)当根节点,那么他的重心一定在\(rt\)的重儿子里,进一步的,可以发现重心一定在 ...

  6. Tornadao Cookie

    cookie的详细介绍.Tronado带签名的cookie原理.基于cookie实现用户验证 cookie详细介绍 cookie本质就是存于浏览器的 键值对. 特性: 每次http请求服务端的时候,都 ...

  7. IDEA快速升级模块版本号

    使用场景 一个多模块的项目中,在功能用重大更新后,需要升级版本号,如果不使用工具,需要手动更改每个pom.xml文件,而使用工具,就可以非常快速的完成版本号的更改. 基本步骤 0.  idea执行ma ...

  8. vue axios的跨域前后端解决方案

    原因出于安全考虑,浏览器有一个同源策略.浏览器中,异步请求的地址与目标地址的协议.域名和端口号三者与当前有不同,就属于跨域请求. 限制跨域访问是浏览器的一个安全策略,因为如果没有这个策略,那么就有被跨 ...

  9. jsp采用ajax传递数组给后台controller并遍历

    ajax传递数组,期间出各种各样的问题,那叫一个头疼,网上各种查,都没有解决,最终摸索摸索加借鉴搞定,不多说,上代码 /* 复选框选定部分 */ $("#delete").clic ...

  10. CSS - 设置placeholder样式

    input::placeholder {         font-size: 12px;         font-family: Arial;         letter-spacing: 5p ...