最近,我支持的一个团队遇到了一个问题,这个值存储在mysql数据库中(并从中检索)。他们告诉我他们在(varchar(255)?)中存储逗号分隔的值。列。
他们报告说,他们的值被悄悄地截断了(他们的代码主要是ruby,其他一些处理是用scala完成的),并要求我们将该列的大小增加一倍。
当然我建议他们正常化将这些值(以前是逗号分隔的)存储在单独的行中,并使用select获取集合(以前是一行)。他们推开并坚持说,他们不希望这些分隔的值用于任何其他类型的数据库查询,也不希望字段的宽度大于新的(512)宽度。
然后我建议他们至少添加一个标记字符串结尾的哨兵(特别是尾随的分号),并在所有抓取操作中检查是否存在这种情况。他们已经实现了这一点,并对这种方法感到满意。
我的问题:
他们的数据是如何被自动截断的?mysql或ruby的db驱动程序中是否有一些设置可以抑制错误?
与更规范化的方法相比,这种哨兵终止值的利弊是什么?
这个以哨兵为终端的值是否有艺术术语或昵称?
有什么更好的方法来解决他们的问题?
最佳答案
实际上,在mysql中很容易“错过”截断,但也很容易让它严格地通知您,而不是试图提供帮助。
从mysql手册:
如果没有启用strict sql模式,并且为char或
超过柱的最大长度的VARCHAR列,值为
截断以适合,并生成警告。用于截断
非空格字符,可能会导致错误发生(而不是
警告)并通过使用严格的SQL模式禁止插入值。
请参阅第5.1.6节“服务器SQL模式”。
如手册所示,您可以设置mysql的几个“strict”模式中的一个,以在这种情况下引发错误(以及许多其他可能导致无提示截断或替换值的模式)。
关于mysql - 用尾随的前哨编码对DBMS存储的值进行编码,以检测截断/损坏;优点?缺点?备择方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10308141/