从mysql的校验和表中选择并仅返回校验和(非表)

从mysql的校验和表中选择并仅返回校验和(非表),mysql,checksum,Mysql,Checksum,当我运行“mysql>校验和表mytable;”时,我得到了以下结果: +------------------+------------+ | Table | Checksum | +------------------+------------+ | mydb.mytable | 1679935596 | +------------------+------------+ 如何在一条mysql语句中只选择并返回上述结果中的校验和(而不是表)? 类似于“从(校

当我运行“mysql>校验和表mytable;”时,我得到了以下结果:

+------------------+------------+
| Table            | Checksum   |
+------------------+------------+
| mydb.mytable     | 1679935596 |
+------------------+------------+
如何在一条mysql语句中只选择并返回上述结果中的校验和(而不是表)? 类似于“从(校验和表mytable)中选择校验和;”???试了好几次,但都不知道

我想要的是:

+------------+
| Checksum   |
+------------+
| 1679935596 |
+------------+

MySQL
CHECKSUM TABLE
命令对表中的每一行(包括行元数据)执行CRC-32校验和。每行前面有一个或多个元数据字节。我只是碰巧知道,在这种情况下,这一行有一个字节,它将包含数字253,或者十六进制0xFD。因此,您可以使用以下功能:

SELECT CRC32(CONCAT(0xFD, 'mytable')) AS Checksum;

.

您可以按列或列之和进行操作。下面是对我的一张桌子的测试

SELECT sum(crc32(email)) as crc from users;
+-------------+
| crc         |
+-------------+
| 10679459550 |
+-------------+


select sum(crc32(concat(user_id,first_name,last_name,email,reportingManager))) as crc from users;
+------------+
| crc        |
+------------+
| 7196315383 |
+------------+
编辑 在传递数据库名和表名的存储过程中,下面的将返回crc。它转到特殊的信息\u模式db为您检索列名,并使用所有这些列和值生成校验和

存储过程:

drop procedure if exists getTableCRC32;
DELIMITER $$
create procedure getTableCRC32
(   dbname varchar(80),
    tableName varchar(80)
)
BEGIN
    set @sql1="select GROUP_CONCAT(`column_name` SEPARATOR ',') into @colNames";
    set @sql1=concat(@sql1," FROM `INFORMATION_SCHEMA`.`COLUMNS`");
    set @sql1=concat(@sql1," WHERE `TABLE_SCHEMA`='",dbName,"'");
    set @sql1=concat(@sql1," AND `TABLE_NAME`='",tableName,"'");
    -- select @sql1;
    PREPARE stmt1 FROM @sql1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    -- select @colNames;
    set @sql2=concat( 'select sum(crc32(concat(',  @colNames, '))) as crc from ',tableName);
    -- select @sql2;
    PREPARE stmt2 FROM @sql2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END
$$
DELIMITER ;
测试它:

call getTableCRC32('so_gibberish','users');
+------------+
| crc        |
+------------+
| 7196315383 |
+------------+
call getTableCRC32('so_gibberish','fish');
+------------+
| crc        |
+------------+
| 3273020843 |
+------------+

运行选择CRC32(CONCAT(0xFD,'mytable')作为校验和,结果为2632462328。为什么这两个校验和不同?这很奇怪。当运行“selectcrc32(CONCAT(0xFD,'mytable'))作为Checksum;”时,我得到了相同的Checksum,结果是2632462328。但当运行“校验和表mytable;”时,结果是1679935596。我的命令有什么问题?我知道如何对一个特定列进行校验和。。。但是一列对我来说是不够的。我不想在mysql语句中硬编码我的列名,除了表名。。。。