精华内容
下载资源
问答
  • 一定会有人立马就说:既然已经实现了varbinary 类型转换成 varchar 类型,你需要做的,只是将函数逆向反转实现便可。 如果真是这么简单,估计网上早就应该有了。但结果是:网上找不到(至少我没有找到),实现也...


     

    在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每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')

    (完)

    展开全文
  • 原因,数据库中关键字数据类型设置和插入数据项的数据类型不一致。 修改数据库中关键字数据类型即可。 补充: varchar varbinary

    原因,数据库中关键字数据类型设置和插入数据项的数据类型不一致。

    修改数据库中关键字数据类型即可。分析可得原先设定表结构是设置错误数据类型了。

    补充:

            varchar      可变长字符类型。与char 字符类型相比,节省存储空间,提升性能。

            varbinary    可变长二进制数据类型。

    展开全文
  • 需求:将SQL Server库表中,某一个Date类型字段更新为null 环境: SQL Server版本: Microsoft SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) Mar 19 2021 19:41:38 Copyright (c) Microsoft ...

    需求:

    需求:将SQL Server库表中,某一个Date类型字段更新为null
    环境:

    • SQL Server版本:
    Microsoft SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) 
    	Mar 19 2021 19:41:38 
    	Copyright (c) Microsoft Corporation
    	Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)
    
    • MyBatis-Plus版本:
    <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.2.0</version>
     </dependency>
    

    官网文档:


    选择:

    • 官网三种解决方案各有优缺点
      方案一:
      全局设置可能会影响其他功能,这种方案不考虑,兼容性差,危险性极高。试想如果你把全局设置改了,项目经理没有做代码审查直接上线了(特别是小团队,人人都有管理员权限),运行期间出现很多数据丢失或异常,排查问题发现是你把MyBatis-Plus全局空处理策略设为了启用。接下来就是数据恢复工作,严重点的要整个团队一起恢复数据,对于没有做数据库备份和系统操作日志记录等安全措施的项目,简直就是地狱。
      方案二:
      限制粒度降低到字段,看情况考虑是否使用,可维护性较差。对于独立模块,改完配置后不会影响现有功能,且以后不会被其他模块引用,这种情况下可以使用,但这个比较隐藏配置可能会给后面的开发和维护引入问题。
      方案三:
      最优解,只影响这一个操作。

    实现

    • 方案二实现(无效)
    @Data
    @TableName("NOTICE_RECEIPT")
    public class NoticeReceipt {
    	@TableId(type = IdType.AUTO)
    	private Integer id;
    	/** 仓库编码 */
    	private String stockNumber;
    	/**  效期 */
    	@TableField(updateStrategy = FieldStrategy.IGNORED)
    	private Date validityPeriod;
    	/** 是否删除,0:否,1:是 */
        @TableLogic(value = "0", delval = "1")
        private Integer isDelete;
    }
    
    @Service
    public class NoticeReceiptServiceImpl extends ServiceImpl<NoticeReceiptMapper, NoticeReceipt> implements NoticeReceiptService {
     	@Override
        public R update(NoticeReceiptVO noticeReceiptVO) {
        	NoticeReceipt noticeReceipt = new NoticeReceipt();
        	noticeReceipt.setId(23);
        	noticeReceipt.setStockNumber("SN20211001");
        	noticeReceipt.setValidityPeriod(null);
    		updateById(noticeReceipt);
    	}
    }
    

    MyBatis Log:

    UPDATE NOTICE_RECEIPT SET stock_number='SN20211001', validity_period=null WHERE id=23 AND is_delete=0;
    

    异常:

    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error updating database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 不允许从数据类型 varbinary 到 date 的隐式转换。请使用 CONVERT 函数来运行此查询。
    
    • 方案三实现(无效)
      修改update方法
    @Override
    public R update(NoticeReceiptVO noticeReceiptVO) {
    	NoticeReceipt noticeReceipt = new NoticeReceipt();
    	noticeReceipt.setId(23);
    	noticeReceipt.setStockNumber("SN20211001");
    	noticeReceipt.setValidityPeriod(null);
    	baseMapper.update(
        noticeReceipt,
        Wrappers.<NoticeReceipt>lambdaUpdate()
                .set(NoticeReceipt::getValidityPeriod, noticeReceipt.getValidityPeriod())
                .eq(NoticeReceipt::getId, noticeReceipt.getId())
       );
    }
    

    MyBatis Log:

    UPDATE NOTICE_RECEIPT SET stock_number='SN20211001', validity_period=null, validity_period=null  WHERE id=23 AND is_delete=0;
    

    和直接update没什么区别,依然报类型转换异常。

    • SQL方案实现(可行方案)
      看来锅不在MyBatis-Plus,可能出在MyBatis底层类型转换上,没招了,下下策自己手写SQL,直接将null写死,问题解决了,但是没有发现问题原因,后续如果有更好的方案再补上
    <update id="cusUpdate">
         UPDATE YUNYAN_NOTICE_RECEIPT
         SET stock_number = #{noticeReceipt.stockNumber},
         <choose>
             <when test="noticeReceipt.validityPeriod == null">
                 validity_period = NULL,
             </when>
             <otherwise>
                 validity_period = #{noticeReceipt.validityPeriod},
             </otherwise>
         </choose>
         WHERE
         is_delete = 0 AND id = #{noticeReceipt.id}
     </update>
    

    展开全文
  • 环境 Navicat软件版本:Navicat premium ...1、数据库表的设计如下,表中photo变量类型varbinary。 2、Navicat软件显示为乱码,如下。 3、右键“保存数据为”,保存为1.txt。文件名随便起。 4、用UE打...

    环境

    Navicat软件版本:Navicat premium 11.1.13(64-bit)

    mysql数据库版本:5.7

     

    问题的提出

    如题。

     

    步骤

    解决方法很简单,备忘。

    1、数据库表的设计如下,表中photo变量类型为varbinary。

    2、Navicat软件显示为乱码,如下。

    3、右键“保存数据为”,保存为1.txt。文件名随便起。

    4、用UE打开,显示如下。

    展开全文
  • 数据库varbinary字符串乱码问题

    千次阅读 2017-07-21 22:10:09
    最近在用Python连接SqlServer数据库,从数据库返回的字段出现乱码问题。 乱码形式如下: ...0x410496B538E853519C726A2...hhhhhhh,到这里就成功解决乱码问题了,但是实现代码存在优化空间,有兴趣的伙伴可以修改
  • 0x00B18046E6B6B646B128437CA44EBFA2010000003FAB2F5413ABEA3AC1FA2AA3DCBCBE7C23EAE861839138820DB0FF67A48A91AE57C3B982119CD880577802BAC81C1F7B6282FE7F35A440AFE78098A887CA6F865C9519CD8C73BDED3C1F6ABD0...
  • 无论是开发人员,或者数据库管理员,无论我们如何努力,如何小心,都难免会需要更改表子段的类型。...在DB2中该如何修改字段类型呢? 基本语法: alter table alter column set data type Examples:
  • SQLSERVER binary 和 varbinary 用法全解

    万次阅读 2018-12-11 11:05:37
    在SQL Server中,使用数据类型 binary(n) 和 varbinary(n) 存储二进制数据,n是指字节数量: binary(n):固定长度为 n 字节,其中 n 值从 1 到 8,000 ,存储空间为 n 字节; varbinary( n | max):可变长度,n 的...
  • 1.在.net中把该地段定义为byte[]数组。//数据库类型varbinary(MAX)private byte[] elementContent; public byte[] ElementContent { get { return elementContent; } set { elementContent...
  • 当然也就需要重新组织表,而如果不跨越就不 会改变表的组织方式,也就值需要修改数据字典和frm文件而已,当然瞬间完成,下面来做 一个测试。对于UTF8字符集,它的这个点是255/3=85。 注意使用版本5.7 引擎为innodb ...
  • 字符串类型Char 和varchar在定义char 跟varchar时,都需要设置长度。语法:char(M); 最大长度为255varchar(M); 最大长度为65532不同编码长度不同GBK最大为:32767utf8最大为:21845M为长度!两者区别:Char的M是固定...
  • MySQL中的数据类型,列选项,视图

    千次阅读 2021-01-18 23:26:58
    列的数据类型整型类型取值范围tinyint-128 - 127smallint-32768 - 32767(几万)mediumint-8388608 - 8388607(几百万)integer-2147484468 - 2147483647(几十亿)bigint-9223372036854775808 - 9223372036854775807(天文...
  • 解决方法: 当插入包含varbinary的表时,选择数据类型对PHP PDO非常重要. 对于文件列,应使用PDO :: PARAM_LTR代替PDO :: PARAM_LTR 要确保DB通过驱动程序输出正确的文件,请将VARBINARY(MAX)字段转换为十六进制字符串,...
  • 修改Sql Server字段类型

    2017-03-21 15:29:00
    由于人员的不段增加varchar(5000)已经不能满足需求,现在的方案是把字段类型由varchar改为text 1 --修改短信人员字段 2 alter table T_BAS_SendMessage alter column [Content] text 3 alter table T_BAS_...
  • 注意两种存储类型支持的字段长度计算方式的不同,会给开发带来一定的困扰,使用varbinary的开发需要深入了解该字段的存储单位,设计字段的时候还要根据业务逻辑计算好N的值是多少。否则可能会被截断 ,在sql_mode为...
  • 了解SQLServer中varchar(max)、nvarchar(max)和varbinary(max) 转载于:http://www.poorren.com/sqlserver-2005-varcharmax-nvarcharmax-varbinarymax/comment-page-1/ 在Microsoft SQLServer2005及以上的...
  • Mybatis逆向工程转换类型修改 添加如下java,需在generatorConfiguration.xml中配置 如图所示: MyJavaTypeResolver.java类内容如下: public class MyJavaTypeResolver implements JavaTypeResolver { protected...
  • varbinary:变长 2进制数据最大长度为8000 image:变长 2进制数据最大长度为2^31-1(2G) 简 介 MSSQL Server主要是由 5种常常用到字段型文本型数值型逻辑型和日期型!许多朋友苦于在些BBS中 ACCESS转换成SQL后字段...
  • 详细分析了 MySQL 支持的各种数据类型,包括数字类型 INETGER、DECIAML、DOUBLE 等,字符串类型 CHAR、VARCHAR、TEXT、BLOB 等,日期时间类型 DATE、TIME、DATETIME 等,JSON 以及空间数据类型。分析了它们的特点和...
  • MySQL 中的数据类型介绍

    万次阅读 多人点赞 2016-04-29 20:24:03
    要了解一个数据库,我们也必须了解其支持的数据类型。 MySQL支持所有标准的SQL数据类型,主要分3类: ·数值类型 ·字符串类型 ·时间日期类型 另一类是几何数据类型,用的不多,也没多介绍。
  • 1.类型映射关系 mysql和hive中的数据类型存在差异,在mysql集成数据到hive中这样的场景下,我们希望在hive中的数据是贴源的,所以在hive中希望创建和mysql结构一致的表。 mysql到hive数据类型映射参考如下: ...
  • bitsCN.comMySQL主主复制,在线修改表结构一直以为双主架构能解决mysql的表在线DDL的需求,但没有实际测试经验。后来发现一直的想法还是有问题的。这里做一个测试。双主架构,在线DDL的实现步骤是:1,首先搭建主主...
  • MySQL BINARY和BIT类型

    2021-01-18 18:33:12
    BINARY和VARBINARY类型BINARY和VARBIANRY类型同CHAR和VARCHAR类型相似,除了BIANARY和VARBINARY类型只包含二进制字符串,即它们只包含byte串而非字符串,它们没有字符集的概念,排序和比较操作都是基于字节的数字值...
  • MySQL数据类型

    千次阅读 2021-01-19 01:23:09
    MySQL与SQLServer的数据类型大同小异。因此,可以忽略与SQLServer相同的地方,在SQLServer的基础上学习。一、整型的显示宽度MySQL数据类型与SQLServer有些不同,其定义的基本形式如下:整型类型(显示宽度)注意,正确...
  • 因为存储引擎指定了表的类型,即如何存储和索引数据、是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。用户在选择存储引擎之前,首先需要确定数据库管理系统支持哪些存储引擎。SQL语句:show engines;...
  • H2内存数据库数据类型

    千次阅读 2018-06-17 11:08:34
    由于H2是由java语言编写的,所以提供的数据类型都和java契合,下面给出数据类型列表:一、基本的数据类型有哪些?1、数字方面 整数(INT) 布尔型(BOOLEAN) 微整数(TINYINT) 小整数(SMALLINT) 大整数(BIGINT...
  • 如果把照片直接保存在SQL Server数据库中,微软推荐用varbinary(MAX)字段。下面的代码演示了用C#操作varbinary(MAX)字段的基本方法。 1、新增记录 private void btnBrowse_Click(object sender, EventArgs e)//...
  • sql语句批量修改字段

    万次阅读 2015-10-22 16:19:30
    一、 根据条件去掉指定记录的前2个字符 ...如果character_expression是一个不受支持的binary数据类型,则返回二进制数据。 6、备注 如果结果值大于返回类型支持的最大数,则产生错误

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,192
精华内容 5,276
关键字:

修改varbinary类型