`

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加密解密函数

    NULL 博文链接:https://nannan408.iteye.com/blog/1995714

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

    三种算法都可以很简单地实现,拒绝冗长的函数代码。 自己整理的东东,决不是随手粘贴来的,多收点分哈。如果正能对你的项目有所帮助,相信是值得滴~

    Microsoft SQL Server 2005 Express Edition SP3

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

    导出创建用户下各个对象数据结构的sql语句的脚本,包括表、视图、索引、约束等等

    修改win_mkdir.bat文件,以便生成存放生成脚本的基本目录及其子目录 win_mkdir.bat文件生成上面所需要的所有目录 打开win_mkdir.bat文件,修改BASE_DIC变量的值,如c:\temp\,该目录是存放生成的脚本文件...

    MSSQL2008常用自定义加密函数

    MSSQL2008常用自定义加密函数 支持16 32位结果 md2 md4 md5 sha sha1 base64等几种加密 编码方式 比如 dbo md5 &quot;xxx&quot; 16 返回16位的md5加密结果;dbo sha &quot;xxx&quot; 32 32位sha编码

    数据库SQL分表存储步骤与方法

    对数据库ChinaGas 中历史表t_base_History进行数据分表存储,按字段CollectDate不同的时间进行存储,建立数据库分组CGdbSF1~CGdbSF7,分组文件如CGdbSF1.ndf,建立分区函数CG_function,分区方案CG_scheme

    C#+sql宿舍管理系统

    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// /// 清理所有正在使用的资源。 /// protected override void Dispose( bool disposing ) { if( disposing ) { ...

    数据库课程设计--图书管理系统.doc

    数据库基础与应用-SQL SERVER2000. 机械工业出版社出版 指导教师 签名日期 年 月 日 系 主 任 审核日期 年 月 日 ----------------------- 数据库课程设计--图书管理系统全文共3页,当前为第1页。 数据库课程设计--...

    Oraclet中的触发器

    在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块,不过有一点不同的是,触发器是隐式调用的,并不能接收参数。 触发器优点 (1)触发器能够实施的检查和操作比主键和外键约束、...

    extlib.dll具体应用,PB10测试通过

    //获得当前网段内的SQLSERVER服务器列表 function string GetSQLServerList() library 'extlib.dll' ALIAS FOR "GetSQLServerList;Ansi" //base64编码 function Integer Base64EnCode(string as_code,string Code...

    asp.net 面试+笔试题目第1/2页

    一名入门的asp.net程序员应该掌握的知识: (1)熟练使用Sql Server中企业管理器、查询分析器和事件探查器,能熟练编写T-SQL、存储过程、用户自定义函数、视图、触发器; (2)了解ASP.net服务器控件的生命周期; ...

    asp.net 面试 笔试题目[附答案]第1/3页

    一名入门的asp.net程序员应该掌握的知识: (1)熟练使用Sql Server中企业管理器、查询分析器和事件探查器,能熟练编写T-SQL、存储过程、用户自定义函数、视图、触发器; (2)了解ASP.net服务器控件的生命周期; ...

    Toad 使用快速入门

    很容易的得到SQL函数的列表和用法描述(Show SQL help Window 按钮) 可以查看SQL语句的执行情况:通过下方的AutoTrace窗口 ,看到SQL语句的实际执行结果和执行效率。 支持历史SQL(F8) :可以方便的查询以前...

    数据库系统的一些专用词汇表.txt

    SQL Server的每个数据库只有一个主数据文件,扩展名为.mdb。 . 辅数据文件: SQL Server数据库管理系统中,所有不适合存储在主数据文件中的数据都存储在辅数据文件中。如果主数据文件可以包含所有的数据,可不用辅...

    PHP程序开发范例宝典III

    实例187 通过mssql_connect()函数连接SQL Server数据库 293 实例188 通过ADO方式实现指定时间段的信息检索 294 实例189 通过函数实现商品信息的检索 296 实例190 通过ADO方式实现输入页码跳转到指定页 297 ...

    易语言540个易模块

    Base64编解码 Bios信息 BMP滤镜模块 BoyChong-神2多方式取IP模块 BoyChong专用常用模块2.0 保存图片1.0 本土化易模块 保证显示 比较大小 编辑标准格式公文2.0 编辑框辅助功能 编码转换大全 变速模块 冰川...

    风越ASP代码生成器 2.4

    常用加解密、编解码(DES、MD5、SHA、BASE64) 批量提取文本,支持正则表达式,可将HTML等文件中指定内容存入数据库 批量查找替换,支持正则表达式 批量文件、文件夹改名,支持正则表达式 正则表达式测试器...

    asp.net知识库

    常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN...

Global site tag (gtag.js) - Google Analytics