为什么数据库字段需要设置默认值最新的答案

我曾经在一家小型创业公司做过数据库维护,那是一个用PHPnowWAMP搭建的网站。
有一天,我遇到了一个奇怪的问题:当我们尝试向 varchar 类型字段插入过长的字符串时,数据库没有抛出错误,而是默默地截断了该字符串。
我想了想,原来是因为我们没有开启MySQL的严格模式。

记得那是2 01 8 年夏天的一个下午,我们坐在一张旧桌子上,面对满屏的代码,突然发现这个看似小问题的背后,可能隐藏着更大的隐患。
如果我们不及时纠正,当数据量增大时,此类问题将变得难以解决。

当时我建议团队成员在开发阶段启用严格模式。
结果大家都很抵触,觉得这样会耽误开发进度。
但我想起了与数据库的尴尬遭遇以及它可能带来的风险,我坚持自己的立场。

现在,当我看到团队成员写建表语句时,我总是提醒他们注意严格的模式设置和默认值的合理使用。
我更喜欢将数字列的默认值设置为 0,将文本列的默认值设置为空字符串 ('')。
这不仅保证了数据的完整性,也方便了后续的数据处理。

至于NULL和''的区别,我不太明白。
我只是根据直觉来判断。
不过我在MySQL 5 .0的时候看过一些资料,说NULL会在MyISAM引擎下对索引和磁盘使用带来额外的开销。
我想也许这些成本现在已经改善了,但具体是如何改善的我不知道。

这个问题提醒我,我们在工作的时候,有时候确实需要坚持自己的观点,即使这意味着要花更多的时间和精力去说服别人。
但更重要的是,我们要学会站在更高的角度思考问题,这样才能避免一些看似小问题,背后却隐藏着大风险。
等等,我突然想到我们公司好像还没有对数据库的性能进行全面的优化。
我想知道这是否会影响我们网站的性能。

mysql中enum是什么意思

那天我在做数据库的一个项目,突然遇到一个需求:需要一个订单表来记录订单的状态,比如“已付款”、“待发货”、“已发货”等。
一开始我打算用VARCHAR类型来存储这些状态,但后来我想这些状态是固定的,不会有太多,那为什么不试试ENUM呢?
我创建了一个 ENUM 列,定义了一些状态值,然后插入了一些数据。
您好,很方便,数据插入没有任何问题。
突然我想到了一个场景。
如果有人不小心插入了不存在的状态值(例如“已取消”),会发生什么情况?我尝试了一下,果然MySQL报错了,因为它不允许插入不在预定义列表中的值。

然后我想如果我使用ENUM的话,查询这些状态应该会更快吧?我跑了一下,发现确实是这样,比VARCHAR快很多。
这让我对ENUM的搜索性能有了更深入的了解。

但是我也意识到ENUM有一个问题,就是一旦定义了,就不容易改变了。
例如,如果有一天“发送”状态需要拆分为“已发送,等待签名”和“已发送,已签名”,那么我需要更改 ENUM 列,这可能会影响现有数据。

我突然想到,如果ENUM的值经常变化的话,也许外键关联的引用表会更灵活。
但对于这种简单的订单状态场景,ENUM 就相当适合了。
等等,还有一件事,我突然想到,如果ENUM有很多值,存储空间会怎样?

MySQL 分组查询中 GROUP BY 要求:何时需要禁用 ONLY_FULL_GROUP_BY 模式?

禁用ONLY_FULL_GROUP_BY模式可以避免某些场景下的非聚合列限制。

真实故事:MySQL 5 .7 升级时,旧查询报错,因为启用了ONLY_FULL_GROUP_BY。
时间:2 01 6 年,MySQL社区呼吁将此模式设为默认设置。
Number:从5 .6 版本开始,默认启用ONLY_FULL_GROUP_BY。

这就是洞。
不要相信简单的逻辑废话。
请不要这样做。