Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别

总结在最后,没啥干货

简单测试了4种类型 bigint tinyint varchar char

单引号 ‘’

双引号 “”

自定义的默认值 如: 未知的姓名

===================================================

新建一张用户表

CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT NULL COMMENT '姓名',`gender` char(64) DEFAULT NULL COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这张表 由于没设置主键 所以可以新增一条 4个字段都是null的数据 (当然这样的数据是毫无意义的)

所有的字段默认值都是 NULL

一. 不做非空约束

1)将所有字段全部设置为空白【NULL>>空白】

SQL预览

ALTER TABLE `user`
MODIFY COLUMN `id`  bigint(20) NULL COMMENT '编号' FIRST ,
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age`  tinyint(4) NULL COMMENT '年龄' AFTER `gender`;

保存结果:成功,表结构没有改变

结论:不做非空约束时,空白 和 NULL 是相同的

2)NULL值是默认的,也不需要测试了【NULL>>NULL】

3)全部修改为 Empty string【NULL>>Empty string】

ALTER TABLE `user`
MODIFY COLUMN `id`  bigint(20) NULL DEFAULT '' COMMENT '编号' FIRST ,
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age`  tinyint(4) NULL DEFAULT '' COMMENT '年龄' AFTER `gender`;

保存结果:失败,报错【1067 - Invalid default value for ‘id’】

其实从改动的sql语句中就能看出来 数字是不存在 ‘’ 这种类型的

结论:无非空约束时,bigint、tinyint类型都不能被设置为 Empty string

此时的表结构

CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT '' COMMENT '姓名',`gender` char(64) DEFAULT '' COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

那么这里就有一个疑问了【如果我手动给name、age设置值’’ “” 或者’未知名称’的区别】

a.

ALTER TABLE `user`
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '性别' AFTER `name`;

b.

ALTER TABLE `user`
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT "" COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT "" COMMENT '性别' AFTER `name`;

a、b保存结果:成功,表结构没有改变

c.

ALTER TABLE `user`
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '未知名称' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '未知性别' COMMENT '性别' AFTER `name`;

保存结果:成功,表结构如下

CREATE TABLE `user` (`id` bigint(20) DEFAULT NULL COMMENT '编号',`name` varchar(64) DEFAULT '未知名称' COMMENT '姓名',`gender` char(64) DEFAULT '未知性别' COMMENT '性别',`age` tinyint(4) DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该表结构,如果新增一条数据

INSERT INTO `user` (age) VALUES    (10);

得到的数据是这样的

你可以不设置值,数据库自动设置了默认值,但是这里会有个陷阱

INSERT INTO `user` (name, age) VALUES (NULL, 11);

没有使用默认值哦,在使用类似PageHelper这样的插件时,注意 insert insertSelective两种方法

小结:不做非空约束时,empty string只针对 字符 类型的字段使用,’'和""同empty string的效果是相同的;空白 和 NULL的效果是相同的

二. 勾选“不是null”

恢复为初始状态,勾选“不是null”表结构如下

CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '编号',`name` varchar(64) NOT NULL COMMENT '姓名',`gender` char(64) NOT NULL COMMENT '性别',`age` tinyint(4) NOT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

此时,所有字段默认都变成了 空白

1)默认为空白,跳过【空白>>空白】

2)修改为:NULL【空白>>NULL】

ALTER TABLE `user`
MODIFY COLUMN `id`  bigint(20) NOT NULL COMMENT '编号' FIRST ,
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '性别' AFTER `name`,
MODIFY COLUMN `age`  tinyint(4) NOT NULL COMMENT '年龄' AFTER `gender`;

保存结果:成功,表结构无变化

3)修改为:Empty string或者 ‘’ 或者 “”【空白>>Empty string】【空白>>’’】【空白>>""】,忽略bigint tinyint

ALTER TABLE `user`
MODIFY COLUMN `name`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '姓名' AFTER `id`,
MODIFY COLUMN `gender`  char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '性别' AFTER `name`,

保存结果:成功,表结构如下

CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '编号',`name` varchar(64) NOT NULL DEFAULT '' COMMENT '姓名',`gender` char(64) NOT NULL DEFAULT '' COMMENT '性别',`age` tinyint(4) NOT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里遇到一个情况

如果是bigint设置成’'再选择成空白,导致保存失败,sql语句是

MODIFY COLUMN `id`  bigint(20) NOT NULL DEFAULT '' COMMENT '编号' FIRST ;

选择NULL才可以恢复,可能是我使用的版本问题

小结: 勾选“不是null”时,empty string只针对 字符 类型的字段使用,’'和""同empty string的效果是相同的;空白 和 NULL的效果是相同的

总结:

1.’'和""同Empty string的效果是相同的(没有内容长度的默认值)

只能使用在字符类型 如: char、varchar、text等,不能使用在数字、时间等类型 如:int、tinyint、bigint、date、double

因为会提示报错

2.空白 和 NULL的效果是相同的,具体情况取决于【非空约束】

a. 非空约束: 都是 DEFAULT NULL

b. 非空约束: 都是 NOT NULL

3.如果感觉看不太明白,建议自己动手测试一下

毕竟1个字段上最直观的展现就DDL语句

博主,你的文笔太垃圾了,每一个字我都认识,连在一起看的我云里雾里的,给点干货?

1.字段勾选上 不是 null

2.设置默认值

3.特殊情况,像是“备注”这种字段,不会成为查询条件的,就随意

写的不够严谨的地方,希望大家多多指正!

NAVICAT MYSQL 建表字段 默认值、EMPTY STRING、空白、NULL 的区别相关推荐

  1. mysql建表语句非空约束默认_Navicat mysql 建表字段 默认值 空白、NULL 、empty string的区别...

    总结在最后,没啥干货 新建一张用户表CREATE TABLE `user` ( `id` bigint(20) DEFAULT NULL COMMENT '编号', `name` varchar(64 ...

  2. postgre 修改表字段默认值

    修改表字段默认值 alter table alf_authority alter column downloadflag set default 'true'; alter table alf_aut ...

  3. mysql建表字段不能重复_MySQL建表的一些约束条件

    1.SQL :结构化查询语言(Structer Query Language) 包含DDL,DCL ,DML,TCL四种语句 DDL:create / alter / drop DCL: grant ...

  4. mysql建表字段属性为clob_MySQL建表的优化策略

    MySQL 建表的优化策略 目录 1. 字符集的选择 1 2. 主键 1 3. 外键 2 4. 索引 2 4.1. 以下情况适合于创建索引 2 4.2. 以下的情况下不适合创建索引 3 4.3. 联合 ...

  5. MySQL建表字段标红

    字段在英文状态下的引号标红,切为中文状态下的引号后建表成功.

  6. mysql给字段设置默认值,以及mysql的严格模式

    一.背景 在插入数据库时,报错#1364,后来才知道是字段在创建的时候,没有设置默认值的原因.关于默认值,我们都知道设置默认值为0或者null的时候,就算我们不插入该字段,数据库也会自动按照默认值填充 ...

  7. mysql+默认值+default_十六、MySQL 中数据类型的默认值 - default 约束-搜云库

    MySQL 中,所有的数据类型,都可以显式或隐式的拥有默认值. 我们可以使用 DEFAULT 约束显式的为列指定一个默认值.比如 CREATE TABLE t1 ( i INT DEFAULT -1, ...

  8. php mysql 表字段_php mysql获取表字段名称和字段信息的三种方法

    php mysql获取表字段名称和字段信息的三种方法 先给出本实例中使用的表的信息: 使用desc获取表字段信息 php代码如下: mysql_connect("localhost" ...

  9. MySQL 建表字段长度的限制问题

    在MySQL建表时,遇到一个奇怪的现象: root@localhost : test 10:30:54>CREATE TABLE tb_test ( -> recordid varchar ...

最新文章

  1. 了解java虚拟机—垃圾回收算法(5)
  2. tp框架实现ajax
  3. 领航商务之选——金立M5 plus体验札记
  4. win7 第一次装 mysql-5.7-winx64 系列,不知道root 密码,该如何处理?
  5. 论文浅尝 | 利用开放域触发器知识改进事件检测
  6. python encode和decode函数说明
  7. MATLAB函数 zp2tf详解
  8. L298N电机驱动模块《转》。
  9. 天正电气lisp是什么文件_电气CAD绘图基础幻灯片
  10. 关系数据库规范化理论
  11. python程序设计,猜数游戏编程实践课程实验
  12. Python+Vue计算机毕业设计报刊征订管理系统uu609(源码+程序+LW+部署)
  13. Java实现若干个数计算平均值并保留小数位 java计算平均值 java四舍五入保留小数
  14. 基于PHP+MySQL大连真爱果汁厂管理系统的设计与实现
  15. 等价无穷小替换及其习题 笔记
  16. 互联网的下一波红利在哪里?
  17. 内蒙古自治区如何应对农村生活污水处理?
  18. matlab声音信号时域频域转换,关于处理用采集卡采集到的声音时域信号转化成频域信号........
  19. VSCode: 快速生成 html 骨架和在浏览器中打开
  20. 【重要】kubeadm高可用master节点(三主两从)

热门文章

  1. k8s安装sqlite3_kubernetes环境部署单节点redis数据库的方法
  2. php setcookie 过期,php cookie怎么设置过期时间?
  3. Java File类File [] listFiles()方法(带示例)
  4. abap 添加alv上的工具栏的按钮_神器必会!“世界上最好的编辑器Source Insight”...
  5. Java编程经典10道_Java经典编程题50道之十二
  6. python学完面向对象之后_Python学完基础语法后,再往后应该学什么?
  7. math.fabs_带有Python示例的math.fabs()方法
  8. Redis使用不当导致应用卡死
  9. C#单例模式的简单使用
  10. 恢复Linux系统权限