我正在尝试使用PostgreSQL 9.1将十六进制转换为十进制
使用此查询:

SELECT to_number('DEADBEEF', 'FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

我得到以下错误:
ERROR:  invalid input syntax for type numeric: " "

我做错什么了?

最佳答案

你现在有两个问题:
to_number不懂十六进制。
Xto_number格式字符串中没有任何意义,任何没有意义的东西显然意味着“跳过字符”。
我对(2)没有权威的理由,只有经验证据:

=> SELECT to_number('123', 'X999');
 to_number
-----------
        23
(1 row)

=> SELECT to_number('123', 'XX999');
 to_number
-----------
         3

文档中提到了双引号模式的行为:
to_dateto_numberto_timestamp中,双引号字符串跳过字符串中包含的输入字符数,例如"XX"跳过两个输入字符。
但不格式化字符的非引号字符的行为似乎未指定。
无论如何,to_number不是将十六进制转换为数字的正确工具,您需要这样说:
select x'deadbeef'::int;

因此,也许this function对你更有效:
CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS integer AS $$
DECLARE
    result  int;
BEGIN
    EXECUTE 'SELECT x' || quote_literal(hexval) || '::int' INTO result;
    RETURN result;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

然后:
=> select hex_to_int('DEADBEEF');
 hex_to_int
------------
 -559038737 **
(1 row)

**为了避免整数溢出错误中出现这样的负数,请使用bigint而不是int来容纳更大的十六进制数(如IP地址)。

关于postgresql - 将文本表示形式的十六进制转换为十进制数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8316164/

10-11 20:21
查看更多