V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
inSpring
V2EX  ›  Go 编程语言

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

  •  
  •   inSpring · 2025 年 5 月 19 日 · 2683 次点击
    这是一个创建于 243 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2025 年 5 月 20 日
    如果字段类型是 datetime ,(比如有个字段表示"签到时间")你们一般怎么定义 default 的值呢?
    14 条回复    2025-05-27 21:16:07 +08:00
    k9982874
        1
    k9982874  
       2025 年 5 月 19 日
    null 和‘’是两种类型,不能互相替换,在数据库中的存储方式及表意都不一样
    根据实际业务需求来
    lizhenda
        2
    lizhenda  
       2025 年 5 月 19 日
    如果定义为 null 在 go 还要特殊处理下,直接 not null 默认为空字符串即可。
    Configuration
        3
    Configuration  
       2025 年 5 月 20 日   ❤️ 1
    我们都是 not null default '',null 值在处理 != 或 not like 的时候跟实际需求不一致
    qloog
        4
    qloog  
       2025 年 5 月 20 日
    用的更多的是:not null default '',在代码里里更方便做各种判断
    Joker520
        5
    Joker520  
       2025 年 5 月 20 日
    直接空字符串''
    yinmin
        6
    yinmin  
       2025 年 5 月 20 日 via iPhone
    null 和’’是 2 个概念,例如填表字段,’’表示完成填表操作了,提交空字符串; null 表示没有完成填表操作。

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

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

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

    go 里面大部分变量初始化都给了默认值,用 null 的话还得写 is null ,漏写就比较蛋疼。
    codehz
        10
    codehz  
       2025 年 5 月 20 日
    null 可以用在联合 unique 约束中表示空缺(因为比较的时候会忽略 null ),但要记得使用触发器或者静态约束来避免插入全空的值
    这种模式在表达一些很特殊的关系的时候有奇效
    zhazi
        11
    zhazi  
       2025 年 5 月 20 日   ❤️ 1
    @yinmin 烂代码从你开始,通过数据类型去控制业务
    CodeCodeStudy
        12
    CodeCodeStudy  
       2025 年 5 月 21 日   ❤️ 1
    我总结了 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
        13
    changz  
       2025 年 5 月 21 日 via Android
    可以类比下 optional
    kingcanfish
        14
    kingcanfish  
       2025 年 5 月 27 日
    就问一个问题 比如说现在表要加一列, 现在数据很多, 考虑性能问题 新加的列设置成 null 还是 not null
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2405 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:46 · PVG 09:46 · LAX 17:46 · JFK 20:46
    ♥ Do have faith in what you're doing.