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

Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别navicat 里添加字段的时候 默认值的选项容易让人疑惑 那么让我们一探究竟 看看不同的选项对 DDL 语句有哪些影响

=================下文中会出现的一些名词===================

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

2.NULL: null语义参考sql语法

3.Empty String: 就是空字符串, 内容长度为0; 有2种写法 单引号 ” 和 双引号 “” 

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

总结对比图

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

简单来说唯一有影响的就是, 图片里黄棕色的 第10行

图1:

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

 改变默认选项: NULL -> EMPTY STRING

图2:

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

图1和图2, sql上的区别:
`name` varchar(255) NULL DEFAULT NULL COMMENT ‘名称’
`name` varchar(255) NULL DEFAULTCOMMENT ‘名称’




图1和图2, name不传值, insert数据后的区别:
{“id”: 1, name: null}
{ “id”: 1, “name”: “”}




总结完毕.

========================分割线=======================

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

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

一. 不做非空约束

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

表结构如下, 为了保持ddl语句简洁  就没设置主键  

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;

所有字段默认都是 NULL

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

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

点击”SQL预览”选项卡,可以看到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次sql:  INSERT INTO `user` () VALUES ()

Navicat mysql 建表字段 默认值、empty string、空白、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

只改动字段name gender, 表结构如下

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;

执行2次:  INSERT INTO `user` () VALUES ()

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

空白和NULL 是一样的 值都是 NULL

Empty String 的值 是空字符串

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

题外话: 设置指定的默认值

手动给name、gender设置值 ‘未知名称’ ‘未知性别’   表结构如下

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

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

数据库默认值生效了, 但是这里会有个陷阱

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

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

出现了NULL,在使用类似PageHelper这样的插件时,注意 insert   insertSelective两种方法的区别

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

二. 有非空约束

Navicat mysql 建表字段 默认值、empty string、空白、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;

所有字段默认都是 空白

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

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次:  INSERT INTO `user` () VALUES ()

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

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;

执行2次:  INSERT INTO `user` () VALUES ()

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

插入的结果都是一样的, 说明 EmptyStirng 等同 空白 和 NULL 

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

总结:看文章最上面的图

建议动手测试一下, 观察DDL语句的变化

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

2018年7月15日 01:40:14 补图

2019年11月8日 02:39:27 简化+补图

mysql DDL语句上字段的非空约束和有默认值、无默认值的区别 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228639.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:33
下一篇 2026年3月16日 下午6:33


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号