【问题标题】:MySQL rows checksumMySQL 行校验和
【发布时间】:2016-05-13 19:35:24
【问题描述】:

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

【问题讨论】:

  • 我们如何知道记录是否已更改?
  • 一种方法是:您必须将 prev 记录存储在某处并使用最新数据库检查它
  • 进行更新。然后使用$pdo->rowCount()mysqli_affected_rows() 查看是否更新了任何行。如果没有,请不要更新历史记录表。
  • Sagi - 你在列上运行校验和,它应该与你之前存储的校验和匹配 - 如果它发生变化,那么它被篡改了。除了防止用户操纵和生成自己的校验和以通过此测试的列之外,还要使用一个键。

标签: php mysql sql database checksum


【解决方案1】:

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

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

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

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

【讨论】:

  • 您可以通过使用CONCAT_WS 在列之间插入逗号(或其他内容)来绕过转置字符限制,这样foo | xbar = foo,xbarfoox | bar = foox,bar .
  • edit ^ 这不是换位,而是包含的分隔符修复的翻译。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 看到您的评论并已经相应地更新了我的答案。感谢您的提醒。 :)
    【解决方案4】:

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

    CHECKSUM TABLE tbl_name
    

    【讨论】:

    • 好电话。这仅适用于整个表而不是单个记录,但如果这是您需要的,它很可能是要走的路。 :)
    • 注意;如果您在大型表(百万+记录)上执行非常频繁,那么此操作可能会很慢。
    • 如果数据库版本不同,这可能不匹配。
    【解决方案5】:

    是的,您可以使用上述代码

        SELECT ROW_COUNT();
    

    然后使用like if Row_Count()>1的条件就可以处理数据了 希望有效

    【讨论】:

    • 他不是想知道他的更新是否改变了什么,他想在更新之前知道他的新数据是否与旧数据不同。
    • 其实这可能是正确的答案。执行UPDATE,看看是否ROW_COUNT() > 0。如果没有,请不要更新历史记录表。
    • 是的,我也这么认为
    • 但是,如果查询可以根据WHERE 条件更新可变数量的行,则可能不容易分辨哪些已更新并需要放入历史记录中。此外,如果历史记录应该包含旧行,那就太晚了。
    • 是的,但取决于他实际上想用它做什么
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2022-07-29
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多