关键字: KingbaseES、人大金仓、sql函数、hex、unhex
函数调研
mysql8 hex函数调研
语法:hex(arg);
功能:将一个字符串或数字转换为十六进制格式的字符串。
其中参数arg分为两种:字符串参数str,数字参数N。
- 对于字符串参数str,hex返回str的十六进制字符串,其中str中每个字符的每个字节的编码以两个十六进制数字表示。
- 对于数字参数N分为两种情况:N为整数时,若超出bigint最大范围,则输出7FFFFFFFFFFFFFFF,若未超出hex将N值的十六进制字符串表示将10进制数以16进制形式显示;N为小数时,会先将N四舍五入为整数再进行hex函数执行。
- 若参数是其他类型,会先转化为字符串然后按字符串进行处理。
mysql8 unhex函数调研
语法:unhex(arg);
功能:将参数种每对十六进制数字转换为该数字表示的字符。
其中参数arg分为两种:字符串参数str,数字参数N。
- 对于字符串参数str,将参数中的每对字符解释为十六进制数字,并将其为该数字所表示的字节。返回类型为binary。
- 参数字符串中的字符必须合法的十六进制数字:“0”…“9”,“A”…“F”,“a”…”f”,如果参数遇到任何非十六进制数字,则返回NULL;
- 对于数值参数N,不接受小数,负数形式参数,返回null,只允许参数为正整数,将N转为字符串处理;
- 对于其他类型参数,返回NULL
推导分析
mysql hex测试用例
函数 |
用例 |
结果 |
hex(str) |
select hex(''); |
空 |
select hex(' '); |
20 |
|
select hex(null); |
null |
|
select hex('aaa'); |
616161 |
|
select hex('111'); |
313131 |
|
select hex('1a1'); |
316131 |
|
select hex('*'); |
2A |
|
select hex('M'); |
4D |
|
select hex('M^1'); |
4D5E31 |
|
select hex('给'); |
E7BB99 |
|
select hex('2023-08-16 00:00:00'); |
323032332D30382D31362030303A30303A3030 |
|
select hex(to_date('2023-08-16 00:00:00','%Y-%m-%d')); |
323032332D30382D31362030303A30303A3030 |
|
select hex('09:30:00'); |
30393A33303A3030 |
|
select hex(time('09:30:00')); |
30393A33303A3030 |
|
select hex('hello'); |
68656C6C6F |
|
select hex(cast('hello' as binary)); |
68656C6C6F |
|
select hex(cast('10' as double)); |
A |
|
select hex(10); |
A |
|
hex(N) |
select hex(12); |
C |
select hex(12.5); |
D |
|
select hex(12.3); |
C |
|
select hex(12.8); |
D |
|
select hex(-12); |
FFFFFFFFFFFFFFF4 |
|
select hex(-12.2); |
FFFFFFFFFFFFFFF4 |
|
select hex(-12.5); |
FFFFFFFFFFFFFFF3 |
|
select hex(123a); |
报错 |
|
select hex(100000000000000000000000000); |
7FFFFFFFFFFFFFFF,warning |
|
mysql unhex测试用例
函数 |
用例 |
mysql结果 |
unhex() |
--skip-binary-as-hex |
|
select unhex(-6161); |
Null,warning |
|
select unhex(123.123); |
Null,warning |
|
select unhex(-123.123); |
Null,warning |
|
select unhex('6161'); |
aa |
|
select unhex(6161); |
aa |
|
select unhex('6161.6262'); |
Null,warning |
|
select unhex('asd'); |
Null,warning |
|
select unhex(346); |
F |
|
select unhex('346'); |
F |
|
select unhex(''); |
空 |
|
select unhex(' '); |
Null,warning |
|
select unhex(null); |
Null |
|
不加—skip-binary-as-hex |
||
select unhex(-6161); |
Null,warning |
|
select unhex(123.123); |
Null,warning |
|
select unhex(-123.123); |
Null,warning |
|
select unhex('6161'); |
0x6161 |
|
select unhex(6161); |
0x6161 |
|
select unhex('6161.6262'); |
Null,warning |
|
select unhex('asd'); |
Null,warning |
|
select unhex(346); |
0x0346 |
|
select unhex('346'); |
0x0346 |
|
select unhex(''); |
0x |
|
select unhex(' '); |
Null,warning |
|
select unhex(null); |
Null |
|
select unhex(now()); |
Null,warning |
|
select unhex(cast('hello' as binary)); |
NULL |
|
hex功能
1、 函数定义:text hex(text str)
函数功能:将str中每个字符对应的字节以十六进制数字表示。
- 如果参数是null则返回null,若为’’则返回null;
- 支持中文传参;
- 如果参数为其他类型,数据库会先将其转换为字符串类型再进行函数转化功能;
函数主要属性:
- proname:hex
- pronamespace:8000(sys)
- prokind:f(普通函数)
- proisstrict:t
- provolatile:i
- proparallel:s
2、 函数定义:text hex(numeric val)
函数功能:将val十进制数计算机中的字节表示以十六进制的字符串显示。
- 如果参数是null则返回null;
- 接受参数为小数,会先将小数四舍五入成整数;
- 参数支持负数。
函数主要属性:
- proname:hex
- pronamespace:8000(sys)
- prokind:f(普通函数)
- proisstrict:t
- provolatile:i
- proparallel:s
unhex功能
- 函数定义:binary unhex(text str);
函数功能:把十六进制格式的字符串返回binary类型的值。
- 参数字符串中的字符必须合法的十六进制数字:“0”…“9”,“A”…“F”,“a”…”f”,如果参数遇到任何非十六进制数字,则返回NULL;
- 参数输入null传出null;
- 参数若为整数类型,将其转换字符串进行处理。
- 其他类型则返回NULL。
实现函数
3.1 unhex函数
Plsql: create function sys.unhex(text) returns binary as $$ declare a varchar; result varchar; begin if $1 is null then return null; else result := concat('0x',$1); return result::binary; end if; end; $$ language plpgsql; //c语言实现 Datum unhex(KDB_FUNCTION_ARGS) { text *val = KDB_GETARG_TEXT_P(0); Binary *res = NULL; text *temp = NULL; temp = (DatumGetTextP(DirectFunctionCall2(textcat,(Datum)cstring_to_text("0x"),PointerGetDatum(val)))); res = DatumGetVarBinaryP(DirectFunctionCall3(binaryin, PointerGetDatum(TextDatumGetCString(temp)), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1))); KDB_RETURN_BINARY_P(res); } |
-
- 3.2 hex函数
create or replace function sys.hex(numeric) returns text as $$ select upper(to_hex($1::bigint)); $$ language sql; CREATE OR REPLACE FUNCTION hex(int4) RETURNS text AS $$select hex($1::numeric)$$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION hex(double) RETURNS text AS $$select hex($1::numeric)$$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION hex(timestamp) RETURNS text AS $$select hex($1::text)$$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION hex(time) RETURNS text AS $$select hex($1::text)$$ LANGUAGE SQL; -- 参数为文本 create function sys.hex(text) returns text as $$ select upper(encode($1::bytea,'hex')); $$ language sql; |
参考资料
《KingbaseES SQL 语言参考手册》