MySQL 行校验和

MySQL rows checksum

是否可以select table 中的整行并得到某种校验和?我正在寻找一种方法来告诉我的代码仅在至少更改了一条记录时才更新数据。从数据变化跟踪的角度来看,它会帮助我缩小历史上记录的一些变化 table。

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

    SELECT ROW_COUNT();

然后使用条件like if Row_Count()>1 then you can process the data 希望有用

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

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

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

另请注意,这并非 100% 安全。如果您从列中删除第一个字符并将其添加为下一列的第一个字符,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}';