用这个查询:
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地址)。
总结以上是内存溢出为你收集整理的postgresql – 将文本表示中的十六进制转换为十进制数全部内容,希望文章能够帮你解决postgresql – 将文本表示中的十六进制转换为十进制数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)