`

SQL Server Base64函数

 
阅读更多
IF OBJECT_ID(N'dbo.c_GetUTF8Code') IS NOT NULL

    DROP FUNCTION dbo.c_GetUTF8Code;

GO

CREATE FUNCTION [dbo].[c_GetUTF8Code]   

   (  
       @char Nchar 
   ) 

RETURNS int 

AS 

--UTF8转码 

BEGIN 

 Declare @Code int 
 Select @Code=Cast(Unicode(@char) as int) 
 Declare @Utf8Code int 
 Set @Utf8Code=0 
 if(@Code<128) 
 begin 
  --0-127 
  --0000-007F 
  --0xxxxxxx 
  --01100010 Unocide 
  --01100010 UTF-8 
  Set @Utf8Code=@Code  
 end 
 else if(@Code>127 and @Code<2048) 
 begin 
  --128-2047 
  --0080-07FF 
  --110xxx xx10xx xxxx 
  --110  7      F    F 
  Declare @C1 int 
  Declare @C2 int 
  Declare @C3 int 
  Select @C1=@Code/0x100  
  Select @C2=(@Code%0x100)/0x10 
  Select @C3=@Code%0x10 
  Select @Utf8Code=0xC080+0x400*@C1+0x100*(@C2/4)+0x10*(@C2%4)+@C3 
 end 
 else if(@Code>2047 and @Code<65536) 
 begin 
  --2047-65535 
  --0110 0010 0001 0001 
  --1110 xxxx 10xx xxxx 10xx xxxx 
  --1110 0110 1000 1000 1001 0001 
  Declare @C11 int 
  Declare @C12 int 
  Declare @C13 int 
  Declare @C14 int 
  Select @C11=@Code/0x1000 
  Select @C12=(@Code%0x1000)/0x100 
  Select @C13=(@Code%0x100)/0x10 
  Select @C14=@Code%0x10 
  Select @Utf8Code=0xE08080+0x10000*@C11+0x400*@C12+0x100*(@C13/4)+0x10*(@C13%4)+@C14  
 end 
 return @Utf8Code 
End 

GO 

-------加密函数[dbo].[base64_utf8encode]----

IF OBJECT_ID(N'dbo.base64_utf8encode') IS NOT NULL

    DROP FUNCTION dbo.base64_utf8encode;

GO
 
CREATE FUNCTION [dbo].[base64_utf8encode]   
(   
 @plain_text varchar(max)   
)   

RETURNS varchar(max)   

AS BEGIN 
--Base64解密 
 DECLARE @output varchar(max) 
 DECLARE @block_start integer 
 DECLARE @map char(64)   
 SET @map='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'  
 SET @output='' 
 SET @block_start=0 
 Declare @plain_textLength int 
 Set @plain_textLength=Len(@plain_text) 
 Declare @RestTransfer int--转码数累积 
 Declare @RestTransferLenth int 
 Set @RestTransfer=0 
 Set @RestTransferLenth=0 
 Declare @CodeInt int 
 Declare @block_val BINARY(3) 
 WHILE @block_start<@plain_textLength 
 BEGIN  
  Set @CodeInt=0 
  SELECT @CodeInt= [dbo].[c_GetUTF8Code](SubString(@plain_text,@block_start+1,1)) 
  Declare @CodeTransfer int 
  Set @CodeTransfer=0 
  --0-127 1位 
  --128-2047 2位 
  --2047-65535 3位 
  if(@CodeInt<128) 
  begin 
   --+1位 
   if(@RestTransferLenth=0 or @RestTransferLenth=1) 
   begin 
    Set @RestTransfer=@RestTransfer*0x100+@CodeInt 
    Set @RestTransferLenth=@RestTransferLenth+1 
   end 
   else if(@RestTransferLenth=2) 
   begin 
    Set @CodeTransfer=@RestTransfer*0x100+@CodeInt 
    Set @RestTransfer=0 
    Set @RestTransferLenth=0 
   end 
  end 
  else if(@CodeInt>127 and @CodeInt<2048) 
  begin 
   --+2位 
   if(@RestTransferLenth=0) 
   begin 
    Set @RestTransfer=@CodeInt 
    Set @RestTransferLenth=2 
   end 
   else if(@RestTransferLenth=1) 
   begin 
    Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt 
    Set @RestTransfer=0 
    Set @RestTransferLenth=0 
   end 
   else if(@RestTransferLenth=2) 
   begin 
    Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x100 
    Set @RestTransfer=@CodeInt%0x100 
    Set @RestTransferLenth=1 
   end 
  end 
  else if(@CodeInt>2047) 
  begin 
   --+3位 
   if(@RestTransferLenth=0) 
   begin 
    Set @CodeTransfer=@CodeInt 
    Set @RestTransfer=0 
    Set @RestTransferLenth=0 
   end 
   else if(@RestTransferLenth=1) 
   begin 
    Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt/0x100 
    Set @RestTransfer=@CodeInt%0x100 
    Set @RestTransferLenth=1 
   end 
   else if(@RestTransferLenth=2) 
   begin 
    --剩余部分十六进制右移两位与新数据前两位之和 
    Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x10000 
    Set @RestTransfer=@CodeInt%0x10000 
    Set @RestTransferLenth=2 
   end 
  end 
  ---累积到3位,执行加密转换 
  if(@CodeTransfer>0x100000) 
  begin 
   SET @block_val = CAST(@CodeTransfer AS BINARY(3))   
   SET @output = @output 
   + SUBSTRING(@map , @block_val/262144  +1,1) 
   + SUBSTRING(@map ,(@block_val/4096&63)+1,1) 
   + SUBSTRING(@map ,(@block_val/64  &63)+1,1) 
   + SUBSTRING(@map ,(@block_val&63)     +1,1) 
  end 
  SET @block_start=@block_start+1   
 END  
 IF @RestTransferLenth>0   
  BEGIN  
  SET @block_val=Cast(@RestTransfer*(Case @RestTransferLenth When 1 Then 65536 Else 256 end) as BINARY(3)) 
  SET @output=@output  
   +SUBSTRING(@map , @block_val/262144+1,    1)   
   +SUBSTRING(@map ,(@block_val/4096  &63)+1,1)   
   +CASE WHEN @RestTransferLenth =1 
   THEN REPLACE(SUBSTRING(@map ,(@block_val/64&63)+1,1),'A','=')   
   ELSE SUBSTRING(@map ,(@block_val/64&63)+1,1) 
    END 
   +CASE WHEN @RestTransferLenth=1   
   THEN '='  
   ELSE REPLACE(SUBSTRING(@map ,(@block_val&63)+1,1),'A','=') 
    END  
  END 
 RETURN @output  
END 

GO 
----------解密函数----------
IF OBJECT_ID(N'dbo.base64_utf8decode') IS NOT NULL

    DROP FUNCTION dbo.base64_utf8decode;

GO

CREATE FUNCTION [dbo].[base64_utf8decode]   
   (   
       @encoded_text varchar(max)   
   )   
   RETURNS varchar(max)   

   AS BEGIN 

--BASE64加密 
DECLARE @output varchar(max) 
DECLARE @block_start int 
DECLARE @encoded_length int 
DECLARE @decoded_length int 
DECLARE @mapr binary(122)   
 
SET @output = ''  
SET @mapr =   
  0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF    --    1-33   
  +0xFFFFFFFFFFFFFFFFFFFF3EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF    --    33-64   
  +0x000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF    --    65-96   
  +0x1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233--    97-122   
SET @encoded_length=LEN(@encoded_text)   
SET @decoded_length=@encoded_length/4*3 
SET @block_start=1   
Declare @Code int 
Set @Code=0 
Declare @CodeLength int--累计连接数,1,2,3 
Set @CodeLength =0 
WHILE @block_start<@encoded_length 
BEGIN 
 Declare @Integer Integer 
 Set @Integer=substring(@mapr,Unicode(substring(@encoded_text,@block_start  ,1)),1)*262144   
     + substring(@mapr,Unicode(substring(@encoded_text,@block_start+1,1)),1)*4096   
     + substring(@mapr,Unicode(substring(@encoded_text,@block_start+2,1)),1)*64   
     + substring(@mapr,Unicode(substring(@encoded_text,@block_start+3,1)),1) 

 Declare @C1 int 
 Declare @C2 int 
 Declare @C3 int 
 --0xFF FF FF 
 Set @C1=@Integer/0x10000 
 Set @C2=(@Integer/0x100)%0x100 
 Set @C3=@Integer%0x100 
 -------------------------------------@C1 
 if(@C1<0x80) 
 begin 
  if(@CodeLength=2) 
  begin 
   --128-2047 
   --0080-07FF 
   --110x xx xx 10xx xxxx 
   Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   --print @Code  
   Set @Code=0 
   Set @CodeLength=0 
  end 
  SET @output=@output+CAST(Cast(@C1 AS BINARY(1))AS VARCHAR(1)) 
 end 
 else 
 begin 
  --码字连接 
  Set @Code=@Code*0x100+@C1 
  SET @CodeLength=@CodeLength+1 
  if(@CodeLength=3) 
  begin 
   --0110 0010 0001 0001 
   --1110 xxxx 10xx xxxx 10xx xxxx 
   --1110 0110 1000 1000 1001 0001 
   Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   Set @Code=0 
   Set @CodeLength=0 
  end 
 end 

 -------------------------------------@C2 
 if(@C2<0x80) 
 begin 
  if(@CodeLength=2) 
  begin 
   --128-2047 
   --0080-07FF 
   --110x xx xx 10xx xxxx 
   Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   --print @Code  
   Set @Code=0 
   Set @CodeLength=0 
  end 
  SET @output=@output+CAST(Cast(@C2 AS BINARY(1))AS VARCHAR(1)) 
 end 
 else 
 begin 
  --码字连接 
  Set @Code=@Code*0x100+@C2 
  SET @CodeLength=@CodeLength+1 
  if(@CodeLength=3) 
  begin 
   --0110 0010 0001 0001 
   --1110 xxxx 10xx xxxx 10xx xxxx 
   --1110 0110 1000 1000 1001 0001 
   Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   Set @Code=0 
   Set @CodeLength=0 
  end 
 end 
 -------------------------------------@C3 
 if(@C3<0x80) 
 begin 
  if(@CodeLength=2) 
  begin 
   --128-2047 
   --0080-07FF 
   --110x xx xx 10xx xxxx 
   Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   --print @Code  
   Set @Code=0 
   Set @CodeLength=0 
  end 
  SET @output=@output+CAST(Cast(@C3 AS BINARY(1))AS VARCHAR(1)) 
 end 
 else 
 begin 
  --码字连接 
  Set @Code=@Code*0x100+@C3 
  SET @CodeLength=@CodeLength+1 
  if(@CodeLength=3) 
  begin 
   --0110 0010 0001 0001 
   --1110 xxxx 10xx xxxx 10xx xxxx 
   --1110 0110 1000 1000 1001 0001 
   Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40 
   SET @output=@output+NCHAR(@Code) 
   Set @Code=0 
   Set @CodeLength=0 
  end 
 end 
 SET @block_start = @block_start + 4   
END  
IF RIGHT(@encoded_text,2)='==' 
 SET @decoded_length=@decoded_length-2 
ELSE IF RIGHT(@encoded_text,1)='=' 
 SET @decoded_length=@decoded_length-1 
RETURN LEFT(@output ,@decoded_length)   
END 


 

分享到:
评论

相关推荐

    sqlserver2005的base64加密解密函数

    在SQL Server 2005中,没有内置的Base64加密函数。但我们可以自定义T-SQL存储过程来实现这个功能。以下是一个简单的Base64编码的示例: ```sql CREATE FUNCTION [dbo].[Base64Encode](@input NVARCHAR(MAX)) ...

    Sql Server Base64加密解密角本

    非常实用的Base64加密,解密角本。基于UTF8,支持中文加解密。

    轻松实现Sql Server 2005下的Base64、MD5、SHA1算法函数

    在SQL Server 2005中,我们可以使用`VARBINARY`和`VARCHAR`数据类型结合内置函数来实现Base64编码与解码: 1. **Base64编码**: ```sql CREATE FUNCTION dbo.Base64Encode(@input VARCHAR(MAX)) RETURNS VARCHAR...

    SqlServerBase64 加密解密.rar

    通过理解Base64的工作原理和SQL Server的相关函数,我们可以灵活地在数据库中处理加密和解密操作,满足数据安全的需求。在实际应用中,还需要根据具体场景选择合适的加密策略,以确保数据的完整性和安全性。

    sql server 命令函数大全

    根据提供的标题、描述、标签及部分内容,我们可以详细探讨SQL Server中的数学函数和其他常用函数的应用。 ### 数学函数 #### 1. 绝对值 (ABS) - **语法**: - `SELECT ABS()` - **示例**: - `SELECT ABS(-1) ...

    SQL Server和Oracle常用函数区别

    在数据库管理领域,SQL Server和Oracle都是广泛应用的关系型数据库管理系统,它们都提供了丰富的函数来处理各种数据操作。本文主要探讨的是这两个系统中常用的数学函数的区别。 1. 绝对值: 在SQL Server中,获取一...

    Oracle 与 SQL Server 常用函数对比

    根据提供的文件信息,本文将对Oracle与SQL Server中的常用数学函数进行对比分析。这些函数包括绝对值、向上取整、向下取整、截断、四舍五入、指数计算、自然对数、以10为底的对数、平方、平方根、幂运算以及随机数和...

    ORACLE中BLOB字段导入到SQL SERVER中的IMAGE字段

    如果是从HEX字符串或Base64编码还原,可以使用SQL函数如`CONVERT(VARBINARY(MAX), HEX_STRING)`或`CAST(/Base64_String/ AS VARBINARY(MAX))`。 4. **创建目标表结构**:在SQL SERVER中创建与源表结构类似的表,但...

    springboot+mybatis+sqlserver

    【标题】"springboot+mybatis+sqlserver"是一个基于Spring Boot、MyBatis和Microsoft SQL Server构建的基础开发框架,适用于快速开发企业级应用。这个框架整合了三个关键组件,旨在简化开发流程,提高开发效率。 ...

    SQLServer和Oracle常用函数对比

    在数据库管理领域,SQL Server 和 Oracle 是两种广泛使用的数据库管理系统,它们都提供了丰富的函数来处理数据。本篇文章将深入探讨 SQL Server 和 Oracle 中常用的数学函数的对比,帮助用户更好地理解和运用这两种...

    使用SQL Server管理和查询数据(SQL Base)

    在IT行业中,数据库管理系统是数据存储和处理的核心工具,而SQL Server是Microsoft公司推出的一款强大的关系型数据库管理系统,尤其适用于企业级的数据管理和分析。本文将深入探讨如何使用SQL Server进行数据管理和...

    SQLServer和Oracle的常用函数对比.docx

    - SQL Server 和 Oracle: 都可以使用 `POWER(base, exponent)` 函数,例如 `POWER(3, 4)` 返回81。 12. **取随机数** - SQL Server: `RAND()` 生成[0,1)之间的随机浮点数。 - Oracle: `DBMS_RANDOM.VALUE(0,1)` ...

    image-tools图像转换工具,可用于图像和base64的转换

    这些函数可能包括`base64ToBlob`,用于将base64编码转换为Blob,以及可能的`blobToBase64`,用于将Blob对象转换回base64编码。同时,这个库可能还提供了其他图像处理功能,如缩放、裁剪、旋转等。 【package.json】...

    SQL SERVER Base(PPT)第四课

    SQL Server是微软公司推出的一种关系型数据库管理系统,它在IT领域广泛应用,特别是在企业级的数据管理和分析中占有重要地位。本课主要围绕SQL Server的基础知识展开,重点讲解了数据查询的相关概念和操作。 首先,...

    Microsoft SQL Server 2005 Express Edition SP3

    Microsoft SQL Server 2005 Express Edition SQL Server 文档小组无法回答技术支持问题,但是欢迎您对本自述文档提出建议和意见。您可以使用提供的链接快速、直接地发送电子邮件反馈。请使用英语发送您的反馈信息...

    C#+SQL Server项目开发实践

    SQL Server是微软公司推出的一款强大的关系型数据库管理系统(RDBMS),常用于企业级的数据存储和管理。将C#与SQL Server结合使用,可以实现高效、安全的数据处理和应用程序开发。 在这个"C#+SQL Server项目开发...

    sqlserver利用linkserver链接oracle操作手册

    针对Oracle端,需在`%ORACLE_BASE%\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora`文件中配置TNS监听器,确保SQL Server能够正确识别Oracle实例。例如,设置`ORCL`为实例名,`MYORACLE`为服务...

    北大青鸟使用SQL Server管理和查询数据(SQL Base)ACCP5.0PPT教材

    本教程——"北大青鸟使用SQL Server管理和查询数据(SQL Base)ACCP5.0PPT教材",旨在帮助初学者掌握SQL Server的基础知识和操作技巧,为日后的数据库管理工作打下坚实基础。 首先,我们从基础开始,了解SQL Server的...

    SqlServer和Oracle的不同的一些体会

    ### SqlServer和Oracle的不同的一些体会 #### 一、概述 在进行数据库移植的过程中,往往会遇到多种数据库间的迁移问题。本文将基于一次从Sql Server到Oracle的数据库移植经历,分享一些重要的区别与注意事项,旨在...

    查询sqlserver下的所有表

    为了获取表的相关信息,我们可以利用SQL Server系统目录视图以及内置函数来实现。 ### 查询SQL Server下的所有表 #### 1. 使用`sys.tables`视图 SQL Server提供了丰富的系统目录视图来存储有关数据库对象的信息。...

Global site tag (gtag.js) - Google Analytics