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';

原文地址:https://www.cnblogs.com/baohanblog/p/12143996.html

时间: 2024-07-30 16:22:48

Mysql 字段类型与约束条件的相关文章

数据引擎 创建表完整语法,字段类型,约束条件

数据引擎 创建表完整语法,字段类型,约束条件 回顾: 1.设置密码与修改密码 mysqladmin -uroot -p password设置的密码 mysqladmin -uroot -p原密码 password新密码 2.破解密码 - 1.先关掉服务,杀死进程 - 2.跳过权限认证启动服务端 - 3.以游客的身份登录即可 3.制作服务 - 1.mysql --install - 2.net start mysql 4.语法: 库的操作: 增: create database 库名; creat

六、mysql字段类型选择

1.char类型字段会自动删除字符串后面所带的空格,而varchar不会 2.char比varchar快..... 3.myisam 建议 char类型,memory char跟varchar一样,都作为char类型处理:innodb建议 varchar类型 4.optimize table 清理碎片 text碎片产生实例: create table emp (id tinying(1),content text)engine=myisam; 新建测试表 insert into emp valu

MySql 字段类型对应 Java 实体类型

前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.String. 任何 MySql 数字类型都可以被转换为任何一种 Java 数字类型. (当然这样也可能出一些四舍五入,溢出,精度丢失之类的问题). Java基础类型与包装类型 a) 如果数据库字段是允许为空的,使用包装类. 如果不允许为空,使用包装的时候,如果你往数据库插入null值,此时就会抛出异常. 然

02 字段类型和约束条件

创建表完整语法字段类型整形浮点型字符类型char定长字符varchar不定长字符日期类型枚举与集合约束条件not null + uniqueprimary key + auto_incrementforeign keydefaultunsignedzerofill TOC 创建表完整语法 约束条件:可有可无 宽度:限制某些数据类型的存储大小 create table 表名( 字段名1 字段类型(宽度) 约束条件, 字段名2 字段类型(宽度) 约束条件 ); 初始约束条件: not null cr

MySQL字段类型 约束

目录 MySQL存储引擎 非空约束 字段类型 整形类型INT TINYINT 浮点类型float 字符类型char varchar 日期类型 枚举集合 约束条件 主键 自增 unsigned无符号 zerofill使用0填充 删除记录 MySQL存储引擎 什么是存储引擎? 数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建.查询.更新和删除数据操作.用于根据不同的机制处理不同的数据 提示:InnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),行锁定 和 外键.(

wpf读取mysql字段类型为text的问题

在读取数据库中的字段时,可能会根据环境的不同导致一些字段的读取方式不尽相同,在sql数据库中读取字段值用的最多的算是dataTable.Rows[行][列],但是到了mysql中就会有一些差别,在flex中可以按照这种方式进行读取,但是到了wpf中读取mysql中的text字段就会有差别,有幸让我碰到了这个问题,当时也是一头雾水,反复检查了数据库中的编码格式及代码块:确定几遍,格式是设定好的格式,代码是熟悉的代码,但是为什么按照常规的方式读取获取到的是byte类型的值呢? --百思不得其解,最后

MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

1. tinyint: 只能存储-128到127大小的数字, 不在乎后面的定义,如tinyint(9). 需1字节存储空间. 当加有UNSIGNED后,数字可以从0增加到255大小. [email protected] : test 22:36:25> create table ti(id tinyint(9), no tinyint(1)); Query OK, 0 rows affected (0.03 sec) [email protected] : test 22:36:44> ins

mysql字段类型

会安装mysql,会几条sql语句,会jdbc,会hibernate配置,以为就会mysql了,最近几天面试被问到mysql的问题,无地自容,系统的学习一下. mysql优化之一,选择合适的而不是最大的数据类型. 整型 类型 占用字节 范围 TINYINT 1 2^8 SMALLINT 2 2^16 MEDIUMINT 3 2^24 INT 4 2^32 BIGINT 8 2^64 浮点型 类型 描述 FLOAT[(M,D)] M表示最大总位数,D表示小数点后最大位数 DOUBLE[(M,D)]

MySQL字段类型详解

MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. 概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式.由MySQL支持的列类型列在下面.下列代码字母用于描述中:M指出最大的显示尺寸.最大的合法的显示尺寸是 255 .D适用于浮点类型并且指出跟随在十进制小数点后的数码的数量.最大可能的值是30,但是应该不大于M