我正在尝试使用PostgreSQL 9.1将十六进制转换为十进制
使用此查询:
SELECT to_number('DEADBEEF', 'FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
我得到以下错误:
ERROR: invalid input syntax for type numeric: " "
我做错什么了?
最佳答案
你现在有两个问题:to_number
不懂十六进制。X
在to_number
格式字符串中没有任何意义,任何没有意义的东西显然意味着“跳过字符”。
我对(2)没有权威的理由,只有经验证据:
=> SELECT to_number('123', 'X999');
to_number
-----------
23
(1 row)
=> SELECT to_number('123', 'XX999');
to_number
-----------
3
文档中提到了双引号模式的行为:
在
to_date
、to_number
和to_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/