postgresql,将无符号数(从mysql)转换为signed(例如65535到-32768 for smallint)

时间:2016-03-24 22:15:22

标签: mysql postgresql

我正在将MySQL数据库迁移到postgresql,我面临一个小问题

数据库正在存储一个hash_something列,这是一个unsigned integer在MySQL上,这个哈希是一个32位的杂音哈希v3

问题是现在我找不到如何将这些数字转换为签名版本的方法。

当然一个解决方法是使用bigint,以便它适合,但它需要更多的地方并减慢查询(因为我们有数亿行)

所以在MySQL或Postgresql中有没有办法进行转换,因为我只关心它是“存储32位的优化类型”这一事实?

1 个答案:

答案 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)