MySQL 行校验和


MySQL rows checksum

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

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

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

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

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

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

CHECKSUM TABLE tbl_name

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

如果连接 NULL 字段,则不会得到任何结果。如果其为 NULL,则将字段替换为字母"A"。

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

这个对我来说效果很好,以确保所有表的数据库结构与以前相同:

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}';

是的,您可以使用提到的代码

    SELECT ROW_COUNT();

然后使用 like 的条件,如果 Row_Count()>1 那么你可以处理数据希望它有效