Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别 | 您所在的位置:网站首页 › navicat修改表字段的长度 › Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别 |
=================下文中会出现的一些名词=================== 1.空白: 如上图, navicat中显示的, 什么都看不见, 但确实是一个存在的选项 这是navicat里独有的, sql语法里没这个的, 根据 "不为null" 的勾选与否, 会转化为 2和3 2.NULL: null语义参考sql语法 3.Empty String: 就是空字符串, 内容长度为0; 有2种写法 单引号 '' 和 双引号 "" =================================================== 无非空约束的字段, 默认值都是 NULL 有非空约束的字段, 默认值都是 空白 所以当字段的默认值发生改变后, 产生的影响就是下面的图 总结对比图 简单来说唯一有影响的就是, 图片里黄棕色的 第10行 图1: 改变默认选项: NULL -> EMPTY STRING 图2: 图1和图2, sql上的区别:`name` varchar(255) NULL DEFAULT NULL COMMENT '名称' `name` varchar(255) NULL DEFAULT '' COMMENT '名称' 图1和图2, name不传值, insert数据后的区别: {"id": 1, name: null} { "id": 1, "name": ""} 总结完毕. ========================分割线======================= 简单测试了4种类型 bigint tinyint varchar char =================================================== 一. 不做非空约束表结构如下, 为了保持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 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 () 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 () 空白和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);数据库默认值生效了, 但是这里会有个陷阱 INSERT INTO `user` (name, age) VALUES (NULL, 11);出现了NULL,在使用类似PageHelper这样的插件时,注意 insert insertSelective两种方法的区别 ============================================================================= 二. 有非空约束表结构如下 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次: INSERT INTO `user` () VALUES () 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 () 插入的结果都是一样的, 说明 EmptyStirng 等同 空白 和 NULL =========================================================================== 总结:看文章最上面的图 建议动手测试一下, 观察DDL语句的变化 写的不够严谨的地方,希望大家多多指正! 2018年7月15日 01:40:14 补图 2019年11月8日 02:39:27 简化+补图 mysql DDL语句上字段的非空约束和有默认值、无默认值的区别 |
CopyRight 2018-2019 实验室设备网 版权所有 |