解决了人大金仓数据库KingbaseES 兼容hex,unhex函数的问题

103 阅读4分钟

Hex,unhex函数之mysql

关键字

hex函数,unhex函数 mysql sqlserver、人大金仓、KingbaseES

问题描述

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

kes 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功能

函数定义:text hex(any str)

函数功能:将str存储在计算机中的字节以十六进制数字表示。

  • 如果参数是null则返回null,若为’’则返回null;
  • 支持中文传参;
  • 如果参数为小数,会先将小数四舍五入成整数;
  • 参数支持负数;

如果参数为其他类型,数据库会先将其转换为字符串类型再进行函数转化功能。

unhex功能
  1. 函数定义:binary unhex(text str);

函数功能:把十六进制格式的字符串返回binary类型的值。

  • 参数字符串中的字符必须合法的十六进制数字:“0”…“9”,“A”…“F”,“a”…”f”,如果参数遇到任何非十六进制数字,则返回NULL;
  • 参数输入null传出null;
  • 参数若为整数类型,将其转换字符串进行处理。
  • 其他类型则返回NULL。

函数主要属性:

  • proname:unhex
  • pronamespace:8000(sys)
  • prokind:f(普通函数)
  • proisstrict:t
  • provolatile:i
  • proparallel:s