SQL Server 中,实现 varbinary 与 varchar 类型之间的数据转换

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。

解析的时候,往往是一个字节(Byte)占用8个位(bit),高位4bit 表示一个十六进制数据,低位4bit 表示一个十六进制数据。

问题描述:在SQL Server 数据库中,如何实现二进制数据与字符串数据之间的直接转换?

一定会有人立马反问我:为什么不在程序中使用 C# 或者 JAVA 或者 C++ 来处理这个业务呢?

我的回答是:这个我知道,也已经实现了。但在一些特殊的应用环境和业务需求面前(如:对数据的统计、对数据的分析),我必须这么做!

SQL Server 数据库中,实现 varbinary 类型转换成 varchar 类型

这个已经有人实现了,并且处理得相当巧妙。实现的思路是:

每次取得 varbinary 中一个字节的数据,然后除以16 获得高位的4bit数据,再模16获得低位的4bit数据;

分别从固定字符串中以下标的形式匹配对应的字符,最后累加起来即可。

代码如下:

复制代码
    --==============================================
    --  FUNCTION  varbin2hexstr
    --  将 varbinary 类型的数据转换为 varchar 类型
    --==============================================
    
    IF OBJECT_ID ('dbo.varbin2hexstr') IS NOT NULL
        DROP FUNCTION dbo.varbin2hexstr
    GO
    
    CREATE function varbin2hexstr(
    @bin varbinary(8000)
    )returns varchar(8000)
    as
    begin
        declare @re varchar(8000),@i int
        select @re='',@i=datalength(@bin)
        while @i>0
            select @re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
                    +substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
                    +@re
                ,@i=@i-1
       -- return('0x'+@re)
        return @re
    end
    
    GO
复制代码

测试示例:

select dbo.varbin2hexstr(0x1432fabcdef1234567890)

来源:SqlServer中varbinary转换成字符串

SQL Server 数据库中,实现 varchar 类型转换成 varbinary 类型

一定会有人立马就说:既然已经实现了varbinary 类型转换成 varchar 类型,你需要做的,只是将函数逆向反转实现便可。

如果真是这么简单,估计网上早就应该有了。但结果是:网上找不到(至少我没有找到),实现也并非如此!

只能自己动手,丰衣足食了。实现的思路是:

先将整个字符串按照每两位分组;

为什么不按照每8位或每4位进行分组?是为了考虑到函数的通用性。

如果按照每 8位 或者 每4位 分组,则整个字符串必须是8或者4的倍数,否则将出现字符不足,前面补 0的情况。

然后对每个字符进行处理,如:字符“A B C D E F” 对应转换为“10 11 12 13 14 15”;

接着对每2个字符进行 16 的幂运算,并求和。如: AB = 10 * 16的一次方 + 11 * 16的零次方;

再将这个2个字符的整数和,转换为一个字节(Byte)长度的 varbinary 数据;

最后将所有的 varbinary 数据直接相加即可。

代码如下:

复制代码
--==============================================
--  FUNCTION  hexstr2varbin
--  将 varchar 类型的数据转换为 varbinary 类型
--==============================================

IF OBJECT_ID ('dbo.hexstr2varbin') IS NOT NULL
    DROP FUNCTION dbo.hexstr2varbin
GO

CREATE function [dbo].[hexstr2varbin](
  @char varchar(8000)
)returns varbinary(8000)
as
begin
    declare @re varbinary(8000), @tempchar varchar(2), 
            @getchar varchar(1), @getint int, @n int, @totalint int,
            @i int, @tempint int, @runNum int -- 字符串截取段数

     select @tempchar='',@i=datalength(@char), @re=0x; 

    if( @i>0)
    begin
        if ( @i%2 = 0) set @runNum= @i/2
        else set @runNum= @i/2 + 1 

        while (@runNum > 0)
        begin
            if(@runNum = 1) set @tempchar = @char 
            else set @tempchar = substring(@char, (@runNum-1)*2,2)

            select @n=1,@totalint=0;
            
            -- 循环处理截取的每个字符串 (这里的字符串长度为2)
            while @n < ( datalength(@tempchar) + 1 )
            begin
                set @getchar=substring(@tempchar,@n,1);

                -- 将字符转换为十六进制对应的数字
                select @getint=case  
                       when @getchar='a' then 10 
                       when @getchar='b' then 11
                       when @getchar='c' then 12 
                       when @getchar='d' then 13
                       when @getchar='e' then 14 
                       when @getchar='f' then 15
                       else  convert(int,@getchar) end;

                set @tempint=@getint*power(16,datalength(@tempchar)-@n)
                set @totalint = @totalint + @tempint
                set @n=@n+1
            end 

               set @re=convert(varbinary(1),@totalint) + @re;    
               set @runNum=@runNum-1;         
        end
    end
   return @re

end
GO
复制代码

测试示例:

select dbo.hexstr2varbin('ffffff2353f5feefaffae1fff1ffbaf1faffa33333333ff3aaafffffffaaff')


本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2012/10/22/2733593.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
53 10
|
2月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
2月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
2月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
413 4
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
104 0
|
SQL 数据库
《SQL与关系数据库理论——如何编写健壮的SQL代码》一2.1 类型和关系
本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第2章 ,第2.1节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1160 1
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
下一篇
DataWorks