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

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

总结在最后,没啥干货

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jjMUIj9-1640790465517)(/images/731/8353641092d4b4e86dc1631fdc4e0a83.png)]

单引号 ‘’

双引号 “”

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

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

新建一张用户表

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.特殊情况,像是“备注”这种字段,不会成为查询条件的,就随意

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

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Empty string(空字符串)是指内容长度为0的字符串。它可以通过单引号 '' 或双引号 "" 来示。 在编程和数据库中,Empty stringNull(空)是不同的概念。空示没有被赋予具体数或数据的状态,而Empty string是一个字符串类型,它可以被赋予具体的空字符串。 在设计结构时,一般议避免使用Null或空,而是将String类型的字段默认设置为Empty string,即空字符串 '',将Int类型的字段默认设置为0。这样可以使数据更加清晰、规范,并且方便进行数据处理和比较。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Navicat mysql 字段 默认empty string空白NULL区别](https://blog.csdn.net/zx1323/article/details/80416852)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL默认NULL、空Empty String区别,如何选择?](https://blog.csdn.net/haibo0668/article/details/119211690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Archie_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值