我正在尝试使用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
文中提到双引号模式应该如何表现:
In
to_date
,to_number
,andto_timestamp
,double-quoted strings skip the number of input characters contained in the string,e.g."XX"
skips two input characters.
但不是格式化字符的非引号字符的行为似乎是未指定的。
在任何情况下,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''' || 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地址)。