Mysql 字段类型与约束条件
一、数值类型
二、日期类型
三、枚举与集合
四、约束条件
五、设置严格模式
一、数值类型
1.1 整型
应用场景: id号、年龄...
tinyint:
有符号:默认范围 -128, 127
无符号:默认范围 0,255
#tinyint 默认有符号:
create table t1(id tinyint,
name varchar(16)
);
insert into t1 values(-128,'tank'),(127,'jason');
insert into t1 values(-129,'sean') #报错
select * from t1;
+------+-------+
| id | name |
+------+-------+
| -128 | tank | #有符号,最小值为-128
| 127 | jason | #有符号,最大值127
+------+-------+
#设置无符号tinyint
create table t2(id tinyint unsigned);
insert into t2 values((-1)); #报错
insert into t2 values((0));
insert into t2 values((255));
insert into t2 values((256)); #报错
select * from t2;
+------+
| id |
+------+
| 0 | #无符号,最小值为0
| 255 | #无符号,最大值为255
+------+
int:
有符号:默认范围(-2147483648, 2147483647)
无符号:默认范围 (0,4294967295)
默认宽度为11
#int 默认有符号:
create table t3(id int);
insert into t3 values(-2147483648);
insert into t3 values(-2147483649); #报错
insert into t3 values(2147483647);
insert into t3 values(2147483648); #报错
select * from t3;
+-------------+
| id |
+-------------+
| -2147483648 | #有符号,最小值为-2147483648
| 2147483647 | #有符号,最大值为2147483647
+-------------+
#设置无符号int
create table t4(id int unsigned)
insert into t4 values((-1));
insert into t4 values((0));
insert into t4 values((4294967295));
insert into t4 values((4294967296));
select * from t4;
------------+
| id |
+------------+
| 0 | #无符号,最小值为0
| 4294967295 | #无符号,最大值为4294967295
+------------+
1.2 浮点型
应用场景:存储薪资、身高、体重、体质参数等
float :FLOAT[(M,D)] ,单精度浮点数(非准确小数值)
double:DOUBLE[(M,D)],双精度浮点数(非准确小数值)
以上两个的m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
decimal:DECIMAL[(M,D)],准确的小数值
m最大值为65,d最大值为30。
# 范围255是最大长度(包括.小数), 30代表是小数的位数
create table t5(x float(255, 30));
create table t6(x double(255, 30));
create table t7(x decimal(65, 30));
# 三种浮点型: 区别在于精确度不一样
insert into t5 values(1.111111111111111111111111111111);
insert into t6 values(1.1111111111111111111111111111);
insert into t7 values(1.1111111111111111111111111111);
#随着小数的增多,精度开始不准确
mysql> select * from t5;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
#精度比float要准确点,但随着小数的增多,同样变得不准确
mysql> select * from t6;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
#精度始终准确,d为30,于是只留了30位小数
mysql> select * from t7;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111100 |
+----------------------------------+
1.4 字符串类型
char: 定长,简单粗暴,浪费空间,存取速度快。
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)。
存储char类型的值时,会往右填充空格来满足长度
create table t8(id int,name char(4));
insert into t8 values(1, 'tank');
insert into t8 values(1, 't');
insert into t8 values(1, '你个大傻子'); #字符长度超过4报错
mysql> select * from t8;
+------+--------------+
| id | name |
+------+--------------+
| 1 | tank |
| 1 | t | # t+3个空格
+------+--------------+
varchar: 不定长字符,精准,节省空间,存取速度慢
存几个字符,就是几个字符的大小,每个字符前都要+1bytes
create table t9(id int, name varchar(4));
insert into t9 values(1, 'bob'); # 1bytes + bob
insert into t9 values(2, 'tank'); # 1bytes + tank
insert into t9 values(3, 'sean'); # 1bytes + sean
insert into t9 values(4, 'jason'); #报错
mysql> select * from t9;
+------+------+
| id | name |
+------+------+
| 1 | bob |
| 2 | tank |
| 3 | sean |
+------+------+
二、日期类型
例如:
date: 2019-12-11
datetime: 2019-12-11 11:11:11
time: 11:11:11
year: 2019
timestamp: 时间戳
注意:TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
create table student(
id int,
name varchar(10),
birth date,
register datetime,
born_year year,
t_time time,
update_time timestamp
);
insert into student values(1, 'baohan', '1996-06-23', '2019-12-12 11:11:11', '1996', '11:11:11', null);
insert into student values(2, 'HCY', '1000-11-11', '1980-11-11 11:11:11','2019', '11:11:11', null);
mysql> select * from student;
+------+--------+------------+---------------------+-----------+----------+---------------------+
| id | name | birth | register | born_year | t_time | update_time |
+------+--------+------------+---------------------+-----------+----------+---------------------+
| 1 | baohan | 1996-06-23 | 2019-12-12 11:11:11 | 1996 | 11:11:11 | 2019-12-11 16:02:45 |
| 2 | HCY | 1000-11-11 | 1980-11-11 11:11:11 | 2019 | 11:11:11 | 2019-12-11 16:03:22 |
+------+--------+------------+---------------------+-----------+----------+---------------------+
三、枚举与集合
字段的值只能在给定范围中选择,如单选框,多选框
enum: 单选 只能在给定的范围内选一个值(多选一),如性别 sex 男male/女female
set : 多选 在给定的范围内可以选择一个或一个以上的值 ,如(爱好1,爱好2,爱好3...)
#enum:多选一
create table t10(id int, name varchar(4), gender enum('male', 'female', 'others'));
# insert into 表名(字段名) values(字段名对应的值);
insert into t13(id, name, gender) values(1, 'tank', 'male');
insert into t13(id, name, gender) values(1, 'tank', '人妖'); #报错,‘人妖’不在范围内
mysql> select * from t10;
+------+------+--------+
| id | name | gender |
+------+------+--------+
| 1 | tank | male |
+------+------+--------+
#set 可 多选一 或 多选多
create table t11(
id int,
name varchar(4),
hobbies set('read', 'sing', 'run', 'think')
);
insert into t11 values(1, 'bob', 'read,sing');
mysql> select * from t11;
+------+------+-----------+
| id | name | hobbies |
+------+------+-----------+
| 1 | bob | read,sing |
+------+------+-----------+
四、约束条件
初始约束条件:not null
#约束插入记录时id不能为空
create table t1(id int not null,name varchar(6));
insert into t1 values(1,'tank');
insert into t1 values(null,'tank'); #报错
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | tank |
+----+------+
unique: :唯一,将某个字段设置为唯一的值
create table t2(id int not null unique,name varchar(4));
insert into t2(id, name) values(1, 'tank'), (2, 'sean');
insert into t2(id, name) values(1, 'bob'); #报错,1已用过
+----+------+
| id | name |
+----+------+
| 1 | tank |
| 2 | sean |
+----+------+
primary key(主键)----> not null unique: pk就是表中的索引: 可以通过索引快速查找某些数据,提高查询效率。
# 将id设置为主键,非空且唯一
create table t3(id int primary key,name varchar(4));
insert into t3(id, name) values(1, 'tank');
insert into t3(id, name) values(2, 'sean');
insert into t3(id, name) values(1, 'bob'); #报错
mysql> desc t3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
auto_increment:自增
# 将id设置为自增
create table t4(id int primary key auto_increment,name varchar(4));
# 自增默认从0开始
insert into t4(name) values('tank');
insert into t4(name) values('sean');
insert into t4(name) values('bob');
insert into t4(name) values('哈哈哥');
mysql> select * from t4;
+----+-----------+
| id | name |
+----+-----------+
| 1 | tank |
| 2 | sean |
| 3 | bob |
| 4 | 哈哈哥 |
+----+-----------+
## 若想自增从指定值开始,可插入第一条数据时先指定id的值;
insert into t4(id, name) values(10, 'tank');
insert into t4(name) values('sean'); # 11
insert into t4(name) values('bob'); # 12
insert into t4(name) values('哈哈哥'); # 13
mysql> select * from t4;
+----+-----------+
| id | name |
+----+-----------+
| 10 | tank |
| 11 | sean |
| 12 | bob |
| 13 | 哈哈哥 |
+----+-----------+
zerofill:使用0填充空格
create table t5(id int zerofill);
insert into t5 values(100);
mysql> select * from t5;
+------------+
| id |
+------------+
| 0000000100 |
+------------+
default:约束插入数据时的默认值
create table t7(id int,
name varchar(32) unique,
password varchar(255) default '000000');
insert into t7(id,name) values(1,'tank');
mysql> select * from t7;
+------+------+----------+
| id | name | password |
+------+------+----------+
| 1 | tank | 000000 |
+------+------+----------+
delete:清空表中所有记录:
truncate:清空表中的所有记录,并且id重置为0
#delete
create table t6(id int primary key auto_increment,name varchar(4));
insert into t6(name) values('tank');
insert into t6(name) values('大大大'), ('sean');
delete from t6;
insert into t6(name) values('tank');
insert into t6(name) values('大大大'), ('sean');
mysql> select * from t6;
+----+-----------+
| id | name |
+----+-----------+
| 4 | tank |
| 5 | 大大大 |
| 6 | sean |
+----+-----------+
#truncate
create table t6(id int primary key auto_increment,name varchar(4));
insert into t6(name) values('tank');
insert into t6(name) values('sean');
truncate table t6;
insert into t6(name) values('tank');
insert into t6(name) values('sean');
mysql> select * from t6;
+----+-----------+
| id | name |
+----+-----------+
| 1 | tank |
| 2 | sean |
+----+-----------+
五、设置严格模式
# 查看数据库配置中变量名包含mode的配置参数:
show variables like "%mode%";
# 修改安全模式:
set session; # 局部有效,只在你当前操作的窗口有效
set global session; # 全局有效,永久有效
# 修改完之后退出当前客户端重新登录即可,不用关闭服务端
set global sql_mode = 'STRICT_TRANS_TABLES';
Mysql 字段类型与约束条件的更多相关文章
- 字符编码,存储引擎,MySQL字段类型,MySQL字段约束条件
字符编码 查看MySQL默认编码命令:\s """ 如果是5.X系列 显示的编码有多种 latin1 gbk 如果是8.X系列 显示的统一是utf8mb4 utf8mb4 ...
- mysql配置与存储引擎与字段类型与约束条件
目录 字符编码与配置文件 存储引擎 创建表的完整语法 字段类型 整型 浮点型 字符类型 数字的含义 枚举与集合 日期类型 约束条件 字符编码与配置文件 在MySQL5.X系列中,显示的字符编码有多种, ...
- MySQL字段类型与操作
MYSQL字段类型与操作 字符编码与配置文件 操作 代码 功能 查看 \s 查看数据库基本信息(用户.字符编码) 配置(配置文件层面) my-default.ini windows下MySQL默认的配 ...
- (转)MySQL字段类型详解
MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...
- MySQL 字段类型介绍
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...
- MySql 字段类型对应 Java 实体类型
前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...
- django中模型详解-字段类型与约束条件
这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...
- MySQL字段类型 约束
目录 MySQL存储引擎 非空约束 字段类型 整形类型INT TINYINT 浮点类型float 字符类型char varchar 日期类型 枚举集合 约束条件 主键 自增 unsigned无符号 z ...
- Java JDBC中,MySQL字段类型到JAVA类型的转换
1. 概述 在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该选择哪种Java类型与之对应?本篇将为你揭开这个答案. 2. 类型映射 java.sql.Types定义了常 ...
随机推荐
- 2019-7-25-VisualStudio-2019-新创建项目添加-git-仓库
title author date CreateTime categories VisualStudio 2019 新创建项目添加 git 仓库 lindexi 2019-7-25 15:8:15 + ...
- SDUT-3441_数据结构实验之二叉树二:遍历二叉树
数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉树的一个按先序遍历输入的字符 ...
- 8.5打包libgdx为一个桌面程序(jar包)
简陋的地图编辑终于做好了,于是要开始制作地图了,想导出为一个windows下可用的程序,让熟人代做地图,然后找人问了下打包流程,其实跟普通java打包为jar没什么区别,记录如下: 导出类型选第三个 ...
- java future模式 所线程实现异步调用(转载
java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场 ...
- js获取当前时间戳以及前一天时间戳
js获取当前时间戳以及前一天时间戳(毫秒) var timestamp = (new Date()).getTime(); console.log(timestamp);//打印当前时间戳 conso ...
- SuperSocket通过 SessionID 获取 Session
前面提到过,如果你获取了连接的 Session 实例,你就可以通过 "Send()" 方法向客户端发送数据.但是在某些情况下,你无法直接获取 Session 实例. SuperSo ...
- 【原生JS】简单取随机数
因为js本身取随机数仅能取 0 到 1之间的数,所以..... 取 1 - 10之间的随机数. function getSJS(x,y,z){ var int = null; while(int &g ...
- oracle中 =: 和 := 分别是什么意思
oracle中 =: 和 := 分别是什么意思 =:应该相当于 a = :b 表明b是个绑定变量,需要执行时进行变量绑定:= 相当于一般编程语言中的 赋值 a := 1 即将 数字1赋值给变量 a
- 微信小程序wx.request 请求方法
data: 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String .转换规则如下: 对于 GET 方法的数据,会将数据转换成 quer ...
- python基础十一之迭代器和生成器
可迭代 内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然. print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值 ...