1
MeteorCat 2018-05-04 13:20:43 +08:00
默认 null 占据一个数据一个字节,每条数据多分配一个字节的空间来表示字段是否为空,无论你是否使用到 null
|
2
MeteorCat 2018-05-04 13:27:33 +08:00
Postgres 没接触过,mysql 和 mariadb 就是这样,不排除其他数据库软件有所优化
|
4
sagaxu 2018-05-04 13:35:45 +08:00 via Android
比如说温度,你用什么值表示这项数据无效?不用 null 再加个字段吗?
|
6
MeteorCat 2018-05-04 13:38:11 +08:00
@SimbaPeng
如果需要不留空,比如 create_datetime 这种创建就需要生成的,就直接当时的时间默认值 如果需要留空,那么比如 update_datetime 这种实时更新,但是前期不留空的,直接给他一个会被识别为 null 字符串 `"0000-00-00 00:00:00"`;如果取出来的话,需要判断是不是该格式,我一般都是时间戳保存转换 |
8
niubee1 2018-05-04 13:39:27 +08:00
比如你定义一个字段是 boolean 类型, 但是如果不是 not null 的话, 而你又忘记给这个字段赋值, 那么, 这个字段就会有 null, false, true 三个状态
|
10
MeteorCat 2018-05-04 13:40:49 +08:00
@shansing 不行,现实上测试过,0 在温度面前也是个特殊值,因为有的地方温度也是存在 0 度,不能将具体存在的温度纳入错误之中
|
11
PressOne 2018-05-04 13:41:45 +08:00 via Android
新版 MySQL 早就没有这个必要了,按需设置,没有数据就 Null,不用强求,不影响索引效率。
|
15
alvinbone88 2018-05-04 14:54:44 +08:00 4
MySQL 里字段尽量不要为空主要是为了排序的考虑,而不是索引的考虑
在 MySQL 里,null 值永远是最小的,而且 null 与其他任何值比较的结果都是 false 这就导致用 ASC 排序时 null 值永远在最前面 |
16
lihongjie0209 2018-05-04 15:07:13 +08:00
@MeteorCat #10 -99999 考虑一下, 之前看到有人用 unix time 的开始时间作为时间的默认值或者是异常值
|
17
jjx 2018-05-04 16:44:06 +08:00
最好取默认值, 否则实际操作中很麻烦
比方说 pg, 要取空白的记录需要 select * from sale_orders where source is null or source=''; |
18
MeteorCat 2018-05-04 17:30:25 +08:00
@lihongjie0209 这种代码层面的验证移交给数据库本身就是极其错误的,数据库不对数据准确性负责,只负责你有数据 insert 没有错误就行了
|
19
MeteorCat 2018-05-04 17:45:54 +08:00
@lihongjie0209 对了,这种还涉及数据库字段的正确配置,比如你 datetime|tinyint 强制硬塞给一个"123456789"|9999----->"0000-00-00 00:00:00"|255,这种我感觉有点离题但是却是个值得思考的问题,因为一方面制定数据库得考虑这些,一方面还要在 DAO 层做这样的判断
|
21
eslizn 2018-05-04 18:47:04 +08:00
看场景来的,楼上各种说默认值的,可能没遇到某个字段唯一,但是是可选的情况
|
22
glues 2018-05-04 18:55:17 +08:00 via iPhone
能加默认值的就尽量 not null,不能加的就不强求
|
24
AltairT 2018-05-04 20:18:47 +08:00
@MeteorCat 这个应该是类似单片机里那个思路,就是把-500~2000 映射到 0~25000 (包括一位小数),就是需要转换一下罢了。不知其他胖友有更好思路吗?
|
25
MeteorCat 2018-05-04 20:19:44 +08:00 via Android 1
@shansing 哈哈哈,不过确实冬季有零度产生的,这个其实是想说 PHP 这种语言很多人都会直接拿 null 和 0 等同 if(null==0),导致有时候到底是哪个字段本身是 null 还是本身温度就是 0,这种假设是存在的
|
26
MeteorCat 2018-05-04 20:23:19 +08:00 via Android
@AltairT 这种-和+的数组情况我们都是有判断极限值的,这种我记得以前 c 的 strlen 以前也有缓冲区溢出攻击,所以基本上都是有做极限值判断
|
27
lolizeppelin 2018-05-04 20:48:21 +08:00 via Android
|
28
MeteorCat 2018-05-05 01:08:26 +08:00
@lolizeppelin = =我以爲是普通零度
|