MySQL之完整建表语句及数据类型
1.创建表的完整语法
create table 表名(
字段名称 数据类型[(长度) 约束条件],
字段名称 数据类型[(长度) 约束条件]
)
必须的:字段名 数据类型 表名
可选的:长度 约束条件 长度用于设置数据的长度 数据类型也是一种约束
约束指的是除了数据类型外的额外的规范 如果添加的数据超过了指定的长度范围,超出范围的就丢弃; 注意: 字段名 和 表名 库名 都不能是mysql的关键字 比如select from not.....
2.数据类型
为什么需要将数据分类?
.为了描述事物 更加准确
.描述起来更方便
.节省内存空间
a 你
utf8 下 5个字节
a b c
unicode 6个字节
mysql支持的数据类型:
整型
*** *** *** ***** ***
tinyint smallint mediumint int bigint
字节数: ()
默认情况下整型是有符号的 需要用一个二进制位存储符号
给整型加上 约束 unsigned来表示无符号 create table t7(id tinyint unsigned);
如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255
如果有符号 例如 tinyint 保存- 其实存的是- 是最小值 修改严格模式:
以上特性的出现是因为 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开始 但是只能给一个序号
多选多
MySQL之完整建表语句及数据类型的更多相关文章
- mysql和oracle建表语句以及数据类型的区别
1.mysql和oracle建表语句的区别 mysql DROP TABLE IF EXISTS `order`;CREATE TABLE `order` ( `id` int(11) NOT NU ...
- mysql建表语句和数据类型
1.创建表的完整语法 create table 表名( 字段名称 数据类型[(长度) 约束条件], 字段名称 数据类型[(长度) 约束条件] ) 必须的:字段名 数据类型 表名 可选的:长度 约束 ...
- mysql 批量导出建表语句 (视图,函数同理)
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream;import ja ...
- mysql中的锁表语句查看方法汇总
mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Val ...
- 三种常用的MySQL建表语句(转)
MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1( ...
- Python导出MySQL数据库中表的建表语句到文件
为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息 # -*- coding: utf-8 -*- import os i ...
- MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称
MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称 INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...
- MySQL建表语句生成Golang代码
1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
腾讯云图片鉴黄集成到C# 官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...
随机推荐
- 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入
文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...
- SQL Server 语法大全
SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...
- Spring开发环境搭建(Eclipse)
开发环境搭建,主要包含2部分: Java安装 Eclipse安装 为易于学习,我们只安装这2个部分,对于一般开发学习也足够了.如果你有其他要安装的,酌情添加. Java安装 我们使用Java8: 下载 ...
- Java中定义常量(Constant) 的几种方法
为了方便大家交流Spark大数据,浪尖建了微信群,目前人数过多,只能通过浪尖或者在群里的朋友拉入群.纯技术交流,偶有吹水,但是打广告,不提醒,直接踢出.有兴趣加浪尖微信. 常量使用目的 1,为什么要将 ...
- CVE-2010-0249(极光)分析报告
2019/9/10 报告doc在文件里面 1. 发现可疑流量 A.分析流量,导出字节流 B.得到网页代码,发现需要执行的代码需要解密(加密的字符串部分太长了,就省略了): C. ...
- Linux每日一练20200219
- python -- 犯过的错之变量作用域
1.写代码时发现取得变量值,会被覆盖,改为图二的写法后case_id则不会覆盖. 原因:可以理解为变量是内存中一个对象的“引用”.在函数参数传值时,变量也是内存对象的引用. 当对象为可更改对象时,是引 ...
- 将java项目转成svn项目
1.需要工具:eclipse / svn插件 2.在需要共享的项目上右键-->team-->Share Project分享项目 3.选择svn 如果需要共享成cvs选择cvs即可. 4.选 ...
- 使用Redux管理React数据流要点浅析
在图中,使用Redux管理React数据流的过程如图所示,Store作为唯一的state树,管理所有组件的state.组件所有的行为通过Actions来触发,然后Action更新Store中的stat ...
- BZOJ:2244: [SDOI2011]拦截导弹
问题: printf("%.5f ",0):为什么错了? 注意: 初始值很重要 题解: 三维偏序问题: 记录从前往后最长上升子序列长度pref,条数preg 从后往前suff,su ...