最近,我支持的一个团队遇到了一个问题,他们在 MySQL 数据库中存储(和检索)一个值。他们告诉我他们将逗号分隔的值存储在 (VARCHAR(255)?) 列中。
他们报告说他们的值被默默地截断(他们的代码主要是 Ruby,其他一些处理是在 Scala 中完成的)并要求我们将该列的大小加倍。
自然地,我建议他们规范化......将这些值中的每一个(以前以逗号分隔)存储在单独的行中,并使用 SELECT 来获取集合(以前应该是单行)。他们回击并坚称他们永远不希望将这些分隔值用于任何其他类型的数据库查询,并且他们永远不需要该字段比新的 (512) 宽度更宽。
然后我建议他们至少添加一个标记字符串结尾的标记(特别是尾随分号)并在所有提取时检查它。他们已经实现了这一点,并对这种方法感到满意。
我的问题:
- 他们的数据是如何被悄悄截断的?MySQL 或他们的 Ruby 数据库驱动程序中是否有一些设置可以抑制错误?
- 与更规范化的方法相比,这种哨兵终止值的优缺点是什么?
- 这个哨兵终止值是否有一些艺术术语或昵称?
- 有什么更好的方法来解决他们的问题?