我正在研究一个数据库系统,其中有一个主要的bd&表和许多从属服务器,销售人员需要从主服务器同步他们的数据。
关于这种安排的一些观点: 1)从属数据库(S)将不时脱机,因此当它们再次启动时,服务将“同步”它们。 (所以没有复制) 2)我无法更改主数据库,因此不能触发。 (想象主db不属于我) 3)同步将在服务中发生,速度并不重要。 4)没有大量的数据 - 所以我甚至可以走每行。 5)行中的数据变化很大,从varchar(3)到varchar(500)
我环顾四周,找到了Md5() - 我认为这很棒,因为那样我就可以将CONCACT()行值和逐行比较。我发现的问题是CONCAT(AND GROUP_CONCAT)有一点限制,因为它有一个字符限制。
获得“行”CHECKSUM或HASH的最佳方式是什么?
CHECKSUM ROW WHERE id = 1会很棒......最接近它的是什么?
更新 我设法得到了“SELECT @@ group_concat_max_len;”返回最大值(4294967295)。但是这段代码仍然不起作用:
SELECT id, MD5(GROUP_CONCAT(MD5(`id`), ...many columns here... ,MD5(`col30`))) AS 'md5Hash' FROM company_table GROUP BY id;
它仍然只适用于少数几列。
答案 0 :(得分:0)
好的,我要回答这个,因为我觉得我已经够了。
所以事实证明是这样的:
SELECT id, MD5(CONCAT(IF(col1,CRC32(col1),CRC32('')), ... ,IF(col20,CRC32(col20),CRC32('')))) AS 'md5has' FROM table
由于CRC32最多只能生成一个10位数值(4,294,967,295),因此CRC的最小值只能产生10个数字(4,294,967,295),因此即使concat或group_concat max为1024,我们也可以生成10位CRC,然后我们可以散列a在一次通过中排成102列。
最佳选择是建立一个多遍系统,在多次通过中散列超过102列的表格。
有点腰部,但仍然比哈希客户端更好...... IO保存仍然很大,除了谁用102列制作表格?!