Ms access 当长文本/备忘字符串是主键字段或“0”时,将其截断为255个字符;索引:是(不允许重复)";

Ms access 当长文本/备忘字符串是主键字段或“0”时,将其截断为255个字符;索引:是(不允许重复)";,ms-access,ms-access-2013,Ms Access,Ms Access 2013,我在MS Access 2013中创建了一个表,其中只有一列是“长文本”类型(前面称为Memo),并将其作为表的主键。我存储了一个包含255个以上字符的长字符串,然后尝试存储另一个字符串,该字符串的前255个字符与以前存储的字符串相同,但前255个字符之后的所有其他字符都不同,MS Access出现“重复数据”错误。在新字符串中,我更改了第255位之后的字符,使用了不同的字符组合,所有字符都给出了错误。但是,当我更改第255个位置之前的任何字符时,它不会给出任何错误。因此,我得出结论,MS Ac

我在MS Access 2013中创建了一个表,其中只有一列是“长文本”类型(前面称为Memo),并将其作为表的主键。我存储了一个包含255个以上字符的长字符串,然后尝试存储另一个字符串,该字符串的前255个字符与以前存储的字符串相同,但前255个字符之后的所有其他字符都不同,MS Access出现“重复数据”错误。在新字符串中,我更改了第255位之后的字符,使用了不同的字符组合,所有字符都给出了错误。但是,当我更改第255个位置之前的任何字符时,它不会给出任何错误。因此,我得出结论,MS Access只检查“长文本”数据类型的前255个字符,以检查该列中的重复项。是这样吗?还有什么原因呢

存储256个字符的字符串: LoreMip Summary Summary印刷和排版行业摘要自1500年以来一直是我的文本的行业标准,现在还没有关于字体和拼图编辑的国际图书目录,所以我的文本不仅存活了五个世纪,而且还存活了两个世纪

字符串错误: LoreMip Summary Summary印刷和排版行业摘要自1500年以来一直是我的文本的行业标准,在未知的情况下,我的文本和拼图编辑器的打印和排版不仅存活了五个世纪,而且还存活了两个世纪

字符串错误: LoreMip Summary Summary印刷和排版行业摘要自1500年以来一直是我的文本的行业标准,在未知的国际图书目录中,我的文本和拼图编辑使特定的图书不仅存活了五个世纪,而且还存活了其他两个世纪

字符串错误: LoreMip Summary Summary印刷和排版行业摘要自1500年起一直是我的文本的行业标准,在未知的情况下,我的文本和拼图编辑器的打印和排版不仅存活了五个世纪,而且还存活了两个世纪123

没有给出错误: LoreMip Summary Summary印刷和排版行业摘要自1500年起一直是我的文本的行业标准,在未知的国际图书目录中,我的文本和拼图编辑使特定的图书不仅存活了五个世纪,而且还存活了五个世纪

没有给出错误: LoreMip Summary Summary印刷和排版行业摘要自1500年以来一直是我的文本的行业标准,在未知的国际图书目录中,我的文本和拼图编辑器不仅存活了五个世纪,而且还存活了五个世纪

没有给出错误: LoreMip Summary Summary印刷和排版行业摘要自1500年起一直是我的文本的行业标准,在不知道的情况下,我的文本和拼图编辑的IntertoKagalleyof Types Bookit不仅存活了五个世纪,而且还存活了三个世纪


请注意以上样本最后几个字符的差异。第一个存储的字符串有256个字符。即使该列不是主键,如果在该列的表设计中将“Indexed:Yes(no duplicates)allowed”(索引:允许重复)值设置为true,则问题仍然存在。

正如@HansUp在注释中所述,Access(特别是Jet/ACE db引擎)仅使用备忘录/长文本字段的前255个字符来创建其索引。因此,它只使用前255个字符来强制执行无重复

@HansUp建议使用一个不同的db引擎,为长字符串和全文搜索提供更好的支持,这可能是最好的方法,但我知道通常还有其他考虑因素限制您解决Access中的问题

因此,这里有一个解决您的问题的只允许访问的方法。这假设您在评论中列出的要求是有效的;i、 例如,您需要存储400到1000个字符之间的唯一字符串


备选案文1

  • 保留您的初始备忘录/长文本字段:备注
  • 创建四个最多250个字符的文本字段(非备忘录/长文本):Notes1、Notes2、Notes3、Notes4
  • 设置所有四个文本字段:Required->True和Allow Zero Length->True(这是确保对少于751个字符的字符串强制执行唯一索引所必需的)
  • 创建一个唯一的索引,并将所有四个文本字段添加到该索引中
  • 不要忽略索引中的空值
  • 存储值时,需要将其存储在Notes字段中,并在四个较小的NotesX字段中拆分字符串

  • 备选案文2:

    保持当前设置并在代码级别强制唯一性。每次更新或插入注释时,都要搜索与前255个字符匹配的所有注释,读取值并在代码中执行比较


    备选方案3(感谢@HansUp在评论中提出这一点):

  • 保留您的初始备忘录/长文本字段:备注
  • 创建一个16或32个字符的文本字段来存储长文本的256位或512位散列:NotesHash
  • 向NotesAsh字段添加唯一索引
  • 每次更改备注字段时,重新计算哈希值并尝试将其存储在表中
  • 此方法的注意事项: