做个调查:大家在 Go 项目中, MySQL 定义 varchar 类型,一般定义为 default null 还是 not null default '' 呢? (当数据允许空的时候)

2025 年 5 月 19 日
 inSpring
3053 次点击
所在节点    Go 编程语言
14 条回复
k9982874
2025 年 5 月 19 日
null 和‘’是两种类型,不能互相替换,在数据库中的存储方式及表意都不一样
根据实际业务需求来
lizhenda
2025 年 5 月 19 日
如果定义为 null 在 go 还要特殊处理下,直接 not null 默认为空字符串即可。
Configuration
2025 年 5 月 20 日
我们都是 not null default '',null 值在处理 != 或 not like 的时候跟实际需求不一致
qloog
2025 年 5 月 20 日
用的更多的是:not null default '',在代码里里更方便做各种判断
Joker520
2025 年 5 月 20 日
直接空字符串''
yinmin
2025 年 5 月 20 日
null 和’’是 2 个概念,例如填表字段,’’表示完成填表操作了,提交空字符串; null 表示没有完成填表操作。

类似 decimal 的 null 和 0 ,考试成绩填 0 表示考了 0 分,填 null 表示缺考。

有些字段不允许空缺,可以不要 null 。具体根据实际业务场景来确认是否要 null 。
june4
2025 年 5 月 20 日
null 还对唯一索引不好使,特别是有联合索引用了 null 时很容易中坑
me262
2025 年 5 月 20 日
not null default ''
everhythm
2025 年 5 月 20 日
not null default ''

大部分数据库应该都不鼓励用 null 了,在索引、计算、排序、连表的时候 null 会有各种各样的问题。

go 里面大部分变量初始化都给了默认值,用 null 的话还得写 is null ,漏写就比较蛋疼。
codehz
2025 年 5 月 20 日
null 可以用在联合 unique 约束中表示空缺(因为比较的时候会忽略 null ),但要记得使用触发器或者静态约束来避免插入全空的值
这种模式在表达一些很特殊的关系的时候有奇效
zhazi
2025 年 5 月 20 日
@yinmin 烂代码从你开始,通过数据类型去控制业务
CodeCodeStudy
2025 年 5 月 21 日
我总结了 mysql 字段不使用 null 的理由

1 、比如文章点击量加 1 ,column_name = column_name + 1 ,如果把字段设成 null ,并且插入数据时没指明 column_name = 0 ,那么+1 操作不起作用;
2 、count(column_name)时,null 的列不包含在内,count(*)则包含 null 的列在里面
3 、计算多列时,如 SELECT id, click1+click2 as click FROM `foo` 如果两个点击量有一个为 null ,那么相加结果就是 null
4 、如果有比较条件,比如 where < 10 ,如果为 null 的话则不包含在内
5 、min(column_name), max(column_name)如果字段有值,则用值比较,如果字段没有值,都是 null 的时候,则为 null

总结:不能运算,不能比较,慢


对于字符串来说,大多数情况下还是用空字符串
changz
2025 年 5 月 21 日
可以类比下 optional
kingcanfish
2025 年 5 月 27 日
就问一个问题 比如说现在表要加一列, 现在数据很多, 考虑性能问题 新加的列设置成 null 还是 not null

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/1132863

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX