在MySQL中使用VARCHAR!(在小型或微型网站上)


Using VARCHAR in MySQL for everything! (on small or micro sites)

我试着搜索这个问题,因为我觉得这是初学者常问的问题,但我只能找到几乎回答的问题。

我们有一个小的PHP应用程序,最多可供5人使用(总共),可能同时供2人使用,所以可伸缩性不是问题。

然而,我仍然喜欢以最佳实践的方式做事,否则坏习惯会演变成永久的坏习惯,并渗透到你编写的代码中,而这些代码面对的不仅仅是5个人。

在这种情况下,我的问题是:对于一个不断发展/变化的小型PHP应用程序,是否有充分的理由在MySQL中使用VARCHAR(250+)以外的任何东西?如果我选择了INT,但后来需要包含字符,那么当我本可以对其进行未来验证并使其成为VARCHAR时,必须回去更改它会很烦人。换言之,对于一个小型应用程序来说,选择除VARCHAR之外的任何具有大字符数的内容似乎都是毫无意义的限制。这是正确的吗?

感谢您的阅读和可能的回答!

如果VARCHAR中有数字1到12,并且需要按数字顺序排列,则得到1,10,11,12,2,3,4,5,6,7,8,9。这样可以吗?好吧,您可以在SQL中说ORDER BY col+0来修复它。你喜欢那个杂烩吗?

一个主要缺点是必须在代码中添加一致性检查。对于一个小型的私有数据库来说,没问题。但对于更大的项目。。。

使用正确的类型将自动进行大量检查。例如,值中是否有错误的字符;日期有效吗。。。

作为奖励,当使用正确的类型时,可以很容易地添加额外的约束;年龄小于110岁;开始日期小于结束日期;索引是另一个表中的现有值吗?

我更喜欢使类型尽可能具体。尽管服务器错误可能很严重,很难调试,但这比数据库不一致要好得多。

养成习惯可能不是一个好主意,因为任何实际数据量都会变得低效。如果使用文本类型,则用于相同数据量的存储空间量将因存储引擎而异。

如果您按照建议执行操作,请不要忘记,所有通常为数字类型的值都需要在PHP中转换为数字类型。例如,如果您将值"123"存储为varchar或文本类型,并将其检索为$someVar,则必须执行以下操作:

$someVar = intval($someVar);

在PHP中可以执行算术运算之前,否则PHP将假定123是一个字符串。

您可能已经知道VARCHAR列是可变长度的字符串。当使用VARCHAR时,我们具有动态内存分配的优势。

VARCHAR与表内联存储,当大小合理时,速度会更快。

如果你的应用程序需要性能,你可以使用CHAR,它比VARCHAR快一点。