MySQL rows checksum

15,264

Solution 1

You can combine the MD5() and CONCAT() functions to generate an MD5 checksum for the row:

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

If one of the columns is nullable, be sure you wrap it in IFNULL(col, ''), as a null will make the result of the CONCAT() also null.

Also be aware that this is not 100% safe. If you remove the 1 character from a column and add it as the first character of the next column, the outcome of the CONCAT() and thus of the MD5 hash will be the same.

Solution 2

You can check changes by comparing your old checksum value with current checksum.

CHECKSUM TABLE tbl_name

Solution 3

Extending Ivars answer for a more robust MD5 checksum of columns;

If concating a NULL field you will not get any result. If its NULL replace the field with the letter 'A'.

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

Solution 4

This one worked very well to me, in order to make sure database structure at all tables are the same as before:

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}';
Share:
15,264
virrion
Author by

virrion

Updated on June 04, 2022

Comments

  • virrion
    virrion almost 2 years

    Is it possible to select entire row in a table and get sort of checksum? I am looking for a way to tell my code to update data only if at least one record has been changed. From perspective of data changes tracking it would help me to size down a number of changes noted in history table.