我在网站上有一个窗体,有很多不同的领域。一些字段是可选的,而一些是强制性的。在我的数据库中,我有一个包含所有这些值的表,在用户没有放入任何数据的数据库列中插入NULL值或空字符串是否更好?MySQL,最好插入NULL或空字符串?
回答
通过使用NULL
,您可以区分“放入数据”和“放入空数据”。
一些更差异:
的
NULL
甲LENGTH
是NULL
,空字符串的LENGTH
是0
。NULL
s在空串之前被排序。COUNT(message)
将计空字符串,但不NULL
小号您可以搜索使用绑定变量一个空字符串而不是为
NULL
。这个查询:SELECT * FROM mytable WHERE mytext = ?
不会匹配
NULL
在mytext
,你从客户端传递的任何值。为了匹配NULL
S,你将不得不使用其他查询:SELECT * FROM mytable WHERE mytext IS NULL
我不知道什么最好的做法是在这里,但除非你想空我一般会倾向于空的犯错表示与空字符串不同的东西,并且用户的输入与您的空字符串定义相匹配。
请注意,我在说你需要定义你希望他们有什么不同。有时让它们有所不同有时是有道理的,有时它不是。如果不是,只需选择一个并坚持下去。就像我说的,我倾向于在大多数时候倾向于NULL。
哦,并且记住,如果该列为空,则该记录不太可能出现在几乎任何基于该列的选择(具有where子句,以SQL术语来说)的查询中,除非该选择是当然是一个空列。
......现在我看到了上面的答案,我认为可以肯定地说,你关心的通常的区别是没有数据和空数据。 :-) – 2009-08-12 18:54:13
有一件事要考虑,如果你有有史以来计划切换数据库,是Oracle does not support empty strings。它们被自动转换为NULL,并且不能使用像WHERE somefield = ''
这样的子句来查询它们。
这听起来令人难以置信的腥,即使在你的链接,所以我试了一下。空字段设置为'',oracle忽略它。报告长度为空而不是0.这是错误的。这需要解决一些问题。想想我会发布这是另一个问题。 – 2009-08-12 19:10:44
'史蒂夫B.':看到这个问题:http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi 2009-08-12 19:16:37
感谢您的参考,但我仍然不明白的推理。 发表为http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings – 2009-08-12 19:24:03
有一点要记住,NULL可能会让你的代码路径变得更加困难。例如在Python中,大多数数据库适配器/ ORM将NULL
映射到None
。
所以像: “你好,无乔·多伊”
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
可能导致为了避免它,你需要像这样的代码:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
这可以使事情变得更加复杂。
在我看来滥用你的数据库来“修复”你的代码或框架中的错误是一个(非常)不好的编码习惯。当没有数据时,你应该插入NULL并且在使用时保持一致。否则,您必须使用如下语句:if(myString == null || myString =“”)。当你的代码中没有设置或定义一个对象时,你也使用了NULL而不是某种“占位符”(在我看来这是一个空字符串)。 – Gertjan 2009-08-12 19:39:16
非常依赖您选择的语言。在Python中“如果不是myString:”测试None和“”。可能主要是文化问题。爪哇人的“坏习惯”是充满活力的人的优雅。 – max 2010-10-21 08:54:30
更好地插入NULL
在MySQL中的数据库中的一致性。外键可以存储为NULL
,但不能为空字符串。
在约束中,您将遇到空字符串的问题。 您可能必须插入带有唯一空字符串的假记录以满足外键约束。糟糕的做法,我猜。
我不知道性能做。但就数据质量而言,null是不好的。
Null为您提供类型maybe
,这会迫使您编写运行时类型检查,例如: something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something)
。
如果您不使用json/hash/array格式,则可以减轻此问题。
- 1. PyMySQL插入NULL或字符串
- 2. MySQL格式化字符串或返回空字符串NULL
- 3. MySQL和PHP - 插入NULL而不是空字符串
- 4. 在mysql中插入查询字符串中的NULL或'string'
- 5. Mysql - 插入带空格的字符串
- 6. 空字符串+ null =“null”?
- 7. 返回null或空字符串
- 8. 性能:在PHP空字符串或NULL
- 9. 在PHP中为MySQL插入生成空字符串NULL的函数
- 10. MySQL:获取空字符串或空字符串
- 11. Django将字符串“(NULL)”插入到MySQL字段中,而不是NULL
- 12. 将`NULL`转换为字符串(空或者字面上`NULL`)
- 13. 如何在PHP PDO中插入空字符串而不是null
- 14. Golang将NULL插入到SQL中而不是空字符串
- 15. 在触发条件中插入空值和字符串'Null
- 16. Kohana的ORM插入NULL而不是空字符串
- 17. 如何向datetime var中插入空或空字符串?
- 18. Xpages空字符串或空字符串
- 19. c#空字符串 - > null?
- 20. 空字符串对NULL
- 21. 插入Python字符串或字典到MySQL
- 22. Mysql唯一值或空字符串
- 23. 当变量为空时,Mysql插入null
- 24. 将空字符串设置为null插入数据库时为空
- 25. ORDER BY字符串(可以是数字或字符串)将空字符串放到最后MySQL
- 26. 在字符串中插入空格
- 27. 插入填充空白到字符串
- 28. 防止插入空字符串
- 29. mysql只插入部分字符串值
- 30. 将Java字符串插入MySQL
但你认为哪一个更快? 0或NULL或“” – 2010-10-16 23:48:30
@aadravid:没有区别。 – Quassnoi 2010-10-17 10:20:55
in InnoDB NULL的占用空间较小 – 2013-07-25 10:41:45