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

Posted

技术标签:

【中文标题】在 MySQL 中使用 VARCHAR 处理一切! (在小型或微型网站上)【英文标题】:Using VARCHAR in MySQL for everything! (on small or micro sites) 【发布时间】:2015-04-21 17:24:17 【问题描述】:

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

我们有一个小型 php 应用程序,最多可供 5 人(总共,永远)使用,并且可能有 2 人同时使用,因此可扩展性不是问题。

但是,我仍然喜欢以最佳实践的方式做事,否则坏习惯会形成永久的坏习惯,并溢出到你编写的代码中,并且要面对超过 5 个人。

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

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

【问题讨论】:

我真的不明白你的例子来证明在任何地方都使用 VARCHAR 是合理的。如果列的目的很明确,并且它的内容应该是数字而不是一些数字代码,你为什么希望它是VARCHAR?您为什么希望该列存储其他内容?也许我只是看不出你在谈论什么样的小项目,它会发展到如此程度,以至于改变专栏的目的。 与应用程序的生存时间和所需的维护相比,开发某些东西所需的时间是微不足道的。第一次全面做好 【参考方案1】:

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

【讨论】:

谢谢,我发现这是一个关于 VARCHAR 与 INT 的有趣“陷阱”。从来没有想过这是一个潜在的问题!【参考方案2】:

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

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

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

我更喜欢使类型尽可能具体。尽管服务器错误可能令人讨厌且难以调试,但它比数据库不一致要好得多。

【讨论】:

【参考方案3】:

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

如果您按照您的建议进行操作,请不要忘记在 PHP 中所有通常为数字类型的值都需要转换为数字类型。例如,如果您将值“123”存储为 varchar 或 text 类型并将其检索为 $someVar,您将必须这样做:

$someVar = intval($someVar);

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

CHAR,当它比 VARCHAR 占用更多空间时,会因为额外的体积而损害性能。 很难选择将哪条评论标记为回答了我的问题的评论,但这条评论为我做到了。谢谢。

以上是关于在 MySQL 中使用 VARCHAR 处理一切! (在小型或微型网站上)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL选择合适的数据类型

mysql中char,varchar与text类型的区别和选用

mysql varchar最大是多少?

何时在 mysql 中使用 TEXT 而不是 VARCHAR [重复]

MySQL中round()四舍五入之坑

mysql的varchar与text对比