MySQL行校验和

时间:2016-02-04 09:11:13

标签: php mysql sql database checksum

是否可以选择表中的整行并获得校验和?我正在寻找一种方法来告诉我的代码只有在至少有一条记录被更改时才更新数据。从数据更改跟踪的角度来看,它可以帮助我减少历史记录表中记录的一些更改。 - 谢谢。

5 个答案:

答案 0 :(得分:3)

您可以组合MD5()CONCAT()函数为该行生成MD5校验和:

SELECT MD5(CONCAT(col1, col2, col3, ...)) as MD5_checksum FROM table;

如果其中一列可以为空,请确保将其包装在IFNULL(col, '')中,因为null会使CONCAT()的结果也为空。

另请注意,这不是100%保存。如果从列中删除1个字符并将其添加为下一列的第一个字符,则CONCAT()的结果以及MD5哈希的结果将相同。

答案 1 :(得分:1)

您可以通过将旧校验和值与当前校验和进行比较来检查更改。

CHECKSUM TABLE tbl_name

答案 2 :(得分:0)

是的,你可以使用上面提到的代码

    SELECT ROW_COUNT();

然后使用类似于Row_Count()> 1的条件,然后您可以处理数据 希望它有效

答案 3 :(得分:0)

扩展Ivars答案,以获得更强大的MD5校验和列;

如果连接NULL字段,则不会得到任何结果。如果它的NULL用字母' A'替换字段。

SELEECT MD5(concat(IFNULL(col1, "A"), IFNULL(col2, "A"), IFNULL(col3, "A"))) 
AS md5_checksum FROM tbl_name;

答案 4 :(得分:0)

这个对我很有用,以确保所有表格的数据库结构与以前相同:

SET SESSION group_concat_max_len = 1000000;
SELECT MD5( GROUP_CONCAT( CONCAT( TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE ) ) ) AS md5 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{your_database_name}';