精华内容
下载资源
问答
  • 8.4.二进制数据类型 8.4.1.bytea的十六进制格式 8.4.2.bytea的逃逸格式 bytea数据类型允许存储二进制串,参见表8.6。 表8.6.二进制数据类型 名字 存储尺寸 描述 bytea 1或4字节外加真正的二进制串 变长二...

    8.4. 二进制数据类型

    bytea数据类型允许存储二进制串,参见表 8.6

    表 8.6. 二进制数据类型

    名字 存储尺寸 描述
    bytea 1或4字节外加真正的二进制串 变长二进制串

    二进制串是一个八位位组(或字节)的序列。 二进制串和字符串的区别有两个: 首先,二进制串明确允许存储零值的字节以及其它不可打印的字节(通常是位于范围 32 到 126 之外的字节)。 字符串不允许零字节,并且也不允许那些对于数据库的选定字符集编码是非法的任何其它字节值或者字节值序列。 第二,对二进制串的操作会处理实际上的字节,而字符串的处理和取决于区域设置。 简单说,二进制字串适用于存储那些程序员认为是裸字节的数据,而字符串适合存储文本。

    bytea类型支持两种用于输入和输出的外部格式:PostgreSQL的历史的逃逸格式和十六进制格式。在输入时这两种格式总是会被接受。输出格式则取决于配置参数bytea_output,其默认值为十六进制(注意十六进制格式是在PostgreSQL 9.0中被引入的,早期的版本和某些工具无法理解它)。

    SQL标准定义了一种不同的二进制串类型, 叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。

    8.4.1. bytea的十六进制格式

    十六进制格式将二进制数据编码为每个字节2个十六进制位,最高有效位在前。整个串以序列\x开头(用以和逃逸格式区分)。在某些情景中,开头的反斜线可能需要通过双写来逃逸,在相同的情况中逃逸格式必须要双写反斜线,下文描述了细节。十六进制位可以是大写也可以是小写,在位对之间可以有空白(但是在位对内部以及开头的\x序列中不能有空白)。十六进制格式和很多外部应用及协议相兼容,并且其转换速度要比逃逸格式更快,因此人们更愿意用它。

    例子:

    SELECT E'\\xDEADBEEF';

    8.4.2. bytea的逃逸格式

    逃逸格式是bytea类型的传统PostgreSQL格式。它采用将二进制串表示成ASCII字符序列的方法,而将那些无法用ASCII字符表示的字节转换成特殊的逃逸语句。从应用的角度来看,如果将字节表示为字符有意义,那么这种表示将很方便。但是在实际中,这常常是令人困扰的,因为它使二进制串和字符串之间的区别变得模糊,并且这种特别的逃逸机制也有点难于处理。因此这种格式可能会在大部分新应用中避免使用。

    在逃逸模式下输入bytea值时,某些值的字节必须被逃逸,而所有的字节值都可以被逃逸。通常,要逃逸一个字节,需要把它转换成与它的三位八进制值, 并且前导一个反斜线(或者两个反斜线,如果使用逃逸串语法将值写成一个字面含义)。反斜线本身(字节值92)也可以用双写的反斜线表示。表 8.7显示了必须被逃逸的字符,并给出了可以使用的替代逃逸序列。

    表 8.7. bytea文字逃逸字节

    十进制字节值 描述 逃逸输入表示 例子 输出表示
    0 0字节 E'\\000' SELECT E'\\000'::bytea; \000
    39 单引号 ''''E'\\047' SELECT E'\''::bytea; '
    92 反斜线 E'\\\\'E'\\134' SELECT E'\\\\'::bytea; \\
    0到31和127到255 不可打印的字节 E'\\xxx'(八进制值) SELECT E'\\001'::bytea; \001

    逃逸不可打印的字节的要求取决于区域设置。在某些实例中,你可以不理睬它们,让它们保持未逃逸的状态。注意在表 8.7的每一个例子中的结果的长度正好是一个字节,即使其输出表示有时超过一个字符。

    表 8.7中所示,要求多个反斜线的原因是写成一个串文字的输入串在PostgreSQL服务器中必须经过两个分析阶段。每一对中的第一个反斜线被串文字分析器(假设使用了逃逸串语法)解释为一个逃逸字符并且因此被消耗,只留下该对中的第二个反斜线(美元符号包围的串可以被用于防止这一层的逃逸)。剩下的反斜线接着被bytea输入函数识别为开始一个三位八进制值或逃逸另一个反斜线。例如,一个传递给服务器的串文字是E'\\001',它在通过逃逸串分析器后变成\001\001接着被送给bytea输入函数,这里它被转换成一个十进制值为1的单字节。注意单引号字符串不会被bytea特殊对待,因此它遵循串文字的正常规则(参见第 4.1.2.1 节)。

    Bytea字节有时在输出时被逃逸。通常,每一个不可打印的字节会被转换成与之等效的三位八进制值并且前置一个反斜线。大部分可打印的字节被表示为它们在客户端字符集中的标准表示形式。十进制值为92(反斜线)的字节在输出时被双写。详情请见表 8.8

    表 8.8. bytea输出逃逸字节

    十进制字节值 描述 逃逸的输出表示 例子 输出结果
    92 反斜线 \\ SELECT E'\\134'::bytea; \\
    0到31和127到255 不可打印的字节 \xxx(八进制值) SELECT E'\\001'::bytea; \001
    32到126 可打印的字节 客户端字符集表示 SELECT E'\\176'::bytea; ~

    根据你使用的PostgreSQL前端,你在逃逸和未逃逸bytea串方面可能需要做额外的工作。例如,如果你的接口自动翻译换行和回车,你可能也不得不逃逸它们。

    本文转自PostgreSQL中文社区,原文链接:8.4. 二进制数据类型

    展开全文
  • 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制...问题描述:在SQL Server 数据库中,如何实现二进制数据与字符串数据之间的直接转换?一定会有人立马反问我:为什么不在程序中使用 C# 或者 JAVA ...

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

    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')

    (完)

    本文出自 “xugang” 博客,请务必保留此出处http://guangrou.blog.51cto.com/404164/1040606

    展开全文
  • 转自:http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据数据类型,如下所示: mssql sqlserver常见数据类型如下:</span> bit:整型,数据...

     转自: http://www.maomao365.com/?p=6738 
    摘要:
    下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示:
     



    mssql sqlserver常见数据类型如下:
    </span>
    bit:整型,数据范围[0,1,null],用于存取布尔值
    tinyint:整型,数据范围[0~256)
    smallint:整型,数据范围[-215~215)
    int:整型,数据范围[-231~231)

    decimal:精确数值型 ,例:decimal(10,2); //共10位,小数点右2位

    numeric:与decimal类似

    smallmoney:货币型

    money:货币型

    float:浮点型,近似数值型

    real:近似数值型

    Smalldatetime:日期时间型,表示从1900年1月1日到2079年6月6日间的日期和时间,精确到分钟

    datetime:日期时间型,从1753年1月1日到9999年12月31日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒

    cursor:特殊数据型,包含一个对游标的引用。用在存储过程中,创建表时不能用

    timestamp:特殊数据型,系统自动的数据类型,不可以操作,当行记录被操作时,此值都会发生变化,每个数据表只允许一个此列存在

    Uniqueidentifier:特殊数据型,全局唯一标识符,GUID

    char:字符型,存储指定长度的定长非统一编码型的数据,必须指定列宽,列宽最大为8000 个字符

    varchar:字符型,存储非统一编码型字符数据,数据类型为变长,要指定该列的最大长度,存储的长度不是列长,而是数据的长度

    text:字符型,存储大量的非统一编码型字符数据

    nchar:统一编码字符型,存储定长统一编码字符型数据,能存储4000种字符,统一编码用双字节结构来存储每个字符

    nvarchar:统一编码字符型,用作变长的统一编码字符型数据

    ntext:统一编码字符型,用来存储大量的统一编码字符型数据

    binary:二进制数据类型,存储可达8000 字节长的定长的二进制数据

    varbinary:二进制数据类型,用来存储可达8000 字节长的变长的二进制数据

    image:二进制数据类型,用来存储变长的二进制数据

     



    从上面的数据类型,我们可以分析出
    mssql sqlserver可存储二进制数据的数据类型为:
    binary varcbinary image
     

    转载于:https://www.cnblogs.com/lairui1232000/p/9244031.html

    展开全文
  • Sql Server使用二进制数据

    千次阅读 2019-05-23 22:18:57
    binary和varbinary数据类型存储位串。尽管字符数据是根据Microsoft SQL Server 2005代码页进行解释的,但binary和varbinary数据仅是位流。 binary数据最多可以存储8000个字节。varbinary使用最大说明符,最多可以...

    binary和varbinary数据类型存储位串。尽管字符数据是根据Microsoft SQL Server 2005代码页进行解释的,但binary和varbinary数据仅是位流。
    binary数据最多可以存储8000个字节。varbinary使用最大说明符,最多可以存储2^31个字节。
    二进制常量以0x(一个零和小写字母x)开始,后跟位模式的十六进制表示形式。例如,0x2A表示十六进制值2A,它等于十进制值42 或单字节位模式00101010。
    存储十六进制值,如安全标识号(SID)、GUID(使用uniqueidentifier数据类型)或可以用十六进制方式存储的复杂数字时,使用二进制数据。
    下面的Transact-SQL示例存储了SID和十六进制标识:

    use ceshi_jxt;
    go
    create table MyCustomerTable( 
        user_login varbinary(85),-- default suser_SID(),
        data_value varbinary(1)
    );
    go
    insert MyCustomerTable(data_value) values(0x4F);

    select * from MyCustomerTable
    go
    执行结果如下图:

    使用SID后:

    use ceshi_jxt;
    go
    create table MyCustomerTable( 
        user_login varbinary(85) default suser_SID(),
        data_value varbinary(1)
    );
    go
    insert MyCustomerTable(data_value) values(0x4F);

    select * from MyCustomerTable
    go

    执行结果如下:

     

    展开全文
  • 问题描述:在SQL Server 数据库中,如何实现二进制数据与字符串数据之间的直接转换? 一定会有人立马反问我:为什么不在程序中使用 C# 或者 JAVA 或者 C++ 来处理这个业务呢?我的回答是:这个我知道,也已经实现了...
  • <p>I am using sql server 2005. data type of a column(id) of a table is binary(16) <p>when I select it, the result is string. for example, actual value of id is 0x65589D8124FA6348A61757A5A93FE9F2, ...
  • C#操作SQLServer中的二进制类型数据方法,包括查询,插入
  • 操作二进制数据

    2011-08-19 13:40:00
    二进制数据在不同的SQL服务器中表示方法不同。SQL Server使用Binary类型表示二进制数据,Oracle使用Blob(大二进制对象)类型表示。在JDBC中操作二进制对象和其他数据类型有所不同,二进制对象通常使用输入、输出流...
  • com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。 因为插入数据时,数据类型或者数据长度和数据库表中字段所对应的类型不符合。 处理:检查数据类型和数据长度。 ...
  • Sql Server 将截断字符串或二进制数据

    千次阅读 2019-09-14 17:47:20
    使用资源管理器的时候遇到这个问题:Sql Server 将截断字符串或二进制数据 问题原因: 表中有属性sphone的长度设置为char(10),但是输入的数据比这个长度设置的大。 解决方案: 修改sPhone的类型或修改数据...
  • 1、创建数据表(MYSQL数据库)create table big_blob (id int(10),blob_txt blob);2、JdbcUtils工具类package com.sunrex;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;...
  • 数据库之二进制数据

    2011-08-19 09:47:00
    在使用数据库的时候大多数情况下数值型、字符型和日期类型的变量存储就已经满足了我们很多的需求。... 在很多各种数据库中的二进制处理方式不同,数据类型也就不一样,微软的sqlserver中二进制数据类型...
  • JAVA中,读取Oracle中二进制BLOB类型数据,出现乱码.. 如果BLOB是文本类型存储的就不会存在乱码 BLOB blob = (oracle.sql.BLOB)rs.getBlob("ys1"); try{ FileOutputStream outStream = new ...
  • [SQLServer JDBC Driver][SQLServer]: 将截断字符串或二进制数据。语句已终止。 原因:增加的数据类型与数据库中字段所定义的不符。 解决方法: 1、修改数据库字段大小; 2、加强数据强壮性,严格的输入判断。 防止...
  • 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六...问题描述:在SQL Server 数据库中,如何实现二进制数据与字符串数据之间的直接转换? 一定会有人立马反问我:为...
  • sqlite 操作二进制数据

    千次阅读 2016-04-08 17:03:07
    sqlite 操作二进制数据需要用一个辅助的数据类型:sqlite3_stmt * 。 这个数据类型记录了一个“sql语句”。为什么我把 “sql语句” 用双引号引起来?因为你可以把 sqlite3_stmt * 所表示的内容看成是 sql语句,但是...
  • java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]将截断字符串或二进制数据。 在完成毕业设计的时候总是碰见了这个烦人的异常,现给出解决方法 主要原因就是你增加的数据字段长度超过...
  • postgresql:如何上传二进制数据

    千次阅读 2009-10-14 22:25:00
    PostgreSQL的二进制数据类型为bytea,可最多保存2G的数据。在ADO、ODBC等接口,可通过带参数化的插入SQL语句上传二进制。 然而在某些接口、SQL语句无法进行参数绑定,或者某些语言没有二进制的类型,或者接口的不...
  • SQLServerException:将截断字符串或二进制数据的解决方法: 最近使用JPA进行保存对象到数据库中怎么也添加不进去,始终报错 主要原因就是你增加的数据字段长度超过数据库中字段所定义长度,去查看一下自己数据库中的...
  • binary固定e69da5e6ba9062616964757a686964616f31333337613165长度(最多为8K)的二进制数据类型。binary[ ( n) ] 固定长度的 n个字节二进制数据。N必须从 1 到 8,000。存储空间大小为 n+4 字节。varbinary可变长度...
  • 在往SQL Server数据库中插入数据时,发现了如下的异常:com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据 从字面上看,是数据没有全部插入到字符串中,原因是如下:数据库中的字段的...
  • 1.二进制日志二进制日志存储修改数据库中表数据的所有动作,包含了所有更新了数据或者已经潜在更新了数据的所有语句。潜在跟新了数据SQL语句例如:无法匹配行的DELETE语句;设置列为当前值的UPDATE语句。除此之外...
  • 主要原因为增加的数据字段长度的问题,如果为临时表的话,字段类型与长度应与原先字段保持一致。 转载于:https://www.cnblogs.com/stupid-chan/p/11341813.html...
  • 运行一个SQL的时候:报错:将截断字符串或二进制数据     出现这种Exception,一般是由于数据类型长度造成的,例如: 数据库定义Field A varchar(50); 但在程序中定义对应Field varchar(100),并填满; 操...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,934
精华内容 773
关键字:

sql二进制数据类型