IQ中得到字符串的十六进制形式
Sybase IQ和ASE中都有函数ascii,返回字符串表达式中第一个字节的整数 ASCII 值!
那么, 如何获得字符串的十六进制形式呢?
比如:以GBK编码的三个汉字“数据库”的十六进制形式为:0xcafdbeddbfe2
可以验证一下: select char(hextoint('ca')) + char(hextoint('fd')) , char(hextoint('be')) + char(hextoint('dd')),char(hextoint('bf')) + char(hextoint('e2'))
本文提供两种方法,主要涉及到的函数有: substring,ascii,inttohex,right,list,string以及sa_rowgenerator系统过程。
第一种方法:
编写成自定义函数的形式
create function Hex(@str varchar(8192))
returns varchar(8192)
--返回字符的十六进制形式
as
begin
declare @len int,@i int,@strhex varchar(16384)
select @i=1,@len=len(@str),@strhex=''
while( @i<=@len )
begin
select @strhex=@strhex + right( inttohex( ascii( substring(@str,@i,1) ) ), 2 )
select @i=@i+1
end
select @strhex='0x'+@strhex
return @strhex
end
go
第二种方法:
使用一条SQL语句就能够实现。主要依赖于sa_rowgenerator系统过程以及list函数。
sa_rowgenerator 返回包含指定起始值和结束值之间的行的结果集。
语法:sa_rowgenerator ( [ rstart [, rend [, rstep ] ] ])
1> select row_num from sa_rowgenerator(1,10,2)
2> go
row_num
-----------
1
3
5
7
9(5 rows affected)
--得到系统表SYSTABLE的所有列名的列表,用逗号分隔。
1> select list(column_name,',') as column_list from syscolumn where table_id=1
2> go
column_list
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
table_id,file_id,count,first_page,last_page,primary_root,creator,first_ext_page,last_ext_page,table_page_count,ext_page_count,table_name,table_type,view_def,remarks,replicate,existing_obj,remote_location,remote_objtype,srvid,server_type,primary_hash_limit,page_map_start,source(1 row affected)
下面的SQL直接返回“数据库”三个汉字的十六进制形式:
select string('0x', list( right(inttohex(ascii(substring('数据库',row_num,1))),2) , '' ) ) from sa_rowgenerator(1,len('数据库'))
将“数据库”两次出现的位置替换成其它字符串,就能得到指定字符串的十六进制形式。