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

总结在最后,没啥干货

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

sql server 建表默认时间 sql建表时设置默认值为0_mysql

单引号 ‘’

双引号 “”

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

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

新建一张用户表

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

sql server 建表默认时间 sql建表时设置默认值为0_database_02

一. 不做非空约束

sql server 建表默认时间 sql建表时设置默认值为0_mysql_03

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

得到的数据是这样的

sql server 建表默认时间 sql建表时设置默认值为0_ci_04

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

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

sql server 建表默认时间 sql建表时设置默认值为0_sql server 建表默认时间_05

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

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

二. 勾选“不是null”

sql server 建表默认时间 sql建表时设置默认值为0_mysql_06

恢复为初始状态,勾选“不是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;

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

sql server 建表默认时间 sql建表时设置默认值为0_sql server 建表默认时间_07

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

因为会提示报错

sql server 建表默认时间 sql建表时设置默认值为0_数据库_08

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

a. 非空约束: 都是 DEFAULT NULL

b. 非空约束: 都是 NOT NULL

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

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

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

1.字段勾选上 不是 null

2.设置默认值

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

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