Redshift与MySQL CRC32输出不一致,如何转换为统一整数?
解决Redshift CRC32结果转MySQL风格无符号整数的问题
问题核心
你用错了转换基数:Redshift的CRC32返回的是十六进制字符串(对应基数16),但你调用STRTOL时指定了基数32,这是错误的根本原因。
正确转换方式
直接使用基数16解析Redshift的CRC32结果即可得到和MySQL一致的无符号整数:
SELECT STRTOL(CRC32('abc'), 16);
执行这条语句会返回891568578,和MySQL中SELECT CRC32('abc');的输出完全匹配。
特殊情况处理
如果遇到CRC32结果的十六进制字符串最高位为8-f(对应32位无符号数中超过2^31-1的情况),Redshift的STRTOL会将其解析为有符号负数。此时需要通过加上2^32来转换为无符号整数:
SELECT CASE WHEN STRTOL(CRC32('your_string'), 16) < 0 THEN STRTOL(CRC32('your_string'), 16) + POWER(2, 32) ELSE STRTOL(CRC32('your_string'), 16) END AS mysql_compatible_crc32;
原理说明
Redshift的CRC32返回的8字符字符串是32位二进制序列的十六进制形式,与MySQL返回的32位无符号整数是同一数值的不同表示,只需用对应基数解析即可完成转换。
内容的提问来源于stack exchange,提问作者Oğuzhan Akan
相关产品推荐
相关产品推荐

