我正在将MySQL数据库迁移到postgresql,我面临一个小问题
数据库正在存储一个hash_something
列,这是一个unsigned integer
在MySQL上,这个哈希是一个32位的杂音哈希v3
问题是现在我找不到如何将这些数字转换为签名版本的方法。
当然一个解决方法是使用bigint,以便它适合,但它需要更多的地方并减慢查询(因为我们有数亿行)
所以在MySQL或Postgresql中有没有办法进行转换,因为我只关心它是“存储32位的优化类型”这一事实?
答案 0 :(得分:1)
我在MySQL端创建了这个函数
CREATE FUNCTION convert_unsigned_to_signed_preserving_bits_32(
x BIGINT UNSIGNED
)
RETURNS BIGINT SIGNED
DETERMINISTIC
RETURN
CASE
WHEN x < POW(2,31) THEN x
ELSE x - POW(2,32)
END
;
所以现在我可以做到
mysql> select convert_unsigned_to_signed_preserving_bits_32(4294967295) as signed ;
+--------+
| signed |
+--------+
| -1 |
+--------+
1 row in set (0.00 sec)