admin

SQL / JDBC中的内联BLOB / BINARY数据类型

sql

假设我要避免在JDBC中使用绑定变量,而要使用“ ad-hoc”语句运行SQL,例如:

connection.createStatement().executeQuery("SELECT ...");

是否有任何内联BLOB数据类型的约定/
JDBC转义语法?我知道H2具有以下语法

INSERT INTO lob_table VALUES (X'01FF');

但这不是标准。有什么一般的解决方案吗?注意,我对通用方法感兴趣。我知道这可能会非常低效。


阅读 221

收藏
2021-05-10

共1个答案

admin

可能没有JDBC转义语法,因此我进行了一些搜索,找到并成功测试了以下内容:

  • SQL Server,Sybase ASE,Sybase SQL Anywhere

    INSERT INTO lob_table VALUES (0x01FF);
    
  • DB2

    -- Use a blob constructor. This is not needed for VARCHAR FOR BIT DATA types
    

    INSERT INTO lob_table VALUES (blob(X‘01FF’));

  • Derby,H2,HSQLDB,Ingres,MySQL,SQLite

    INSERT INTO lob_table VALUES (X'01FF');
    
  • 甲骨文

    -- As mentioned by a_horse_with_no_name, keep in mind the relatively low
    

    – limitation of Oracle’s VARCHAR types to hold only 4000 bytes!
    INSERT INTO lob_table VALUES (hextoraw(‘01FF’));

  • Postgres

    -- There is also hex encoding as of Postgres 9.0
    

    – The explicit cast is important, though
    INSERT INTO lob_table VALUES (E’\001\377’::bytea);

有关H的十六进制编码的更多详细信息,请参见AH的答案。
最短,最简单的解决方案是(至少从PostgreSQL 9.0开始):

insert into lob_table (data) values( E'\\x0102030405FF' )

没有任何强制转换(如果该列已经是bytea一个),并且在开始处仅一个 \x标记。这是“二进制数据类型”部分中记录的“十六进制格式” 。

关于X‘01FF’语法:根据字符串常量文档,PostgreSQL确实支持它-用于位字符串。看来,从位到字节转换没有标准转换。

  • SQL标准

    -- SQL actually defines binary literals as such
    

    – (as implemented by DB2, Derby, H2, HSQLDB, Ingres, MySQL, SQLite):
    ::=
    X [ … ]
    [ { [ … ] [ … ] }… ]

    ::=
    | A | B | C | D | E | F | a | b | c | d | e | f

2021-05-10