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

Luk*_*der 10 sql binary blob inline jdbc

假设我想避免在JDBC中使用绑定变量并使用"ad-hoc"语句运行SQL,例如:

connection.createStatement().executeQuery("SELECT ...");
Run Code Online (Sandbox Code Playgroud)

是否有任何约定/ JDBC转义语法来内联BLOB数据类型?我知道H2有这样的语法:

INSERT INTO lob_table VALUES (X'01FF');
Run Code Online (Sandbox Code Playgroud)

但那不是标准.任何一般解决方案 请注意,我对一般方法感兴趣.我知道这可能会变得非常低效.

Luk*_*der 24

可能没有JDBC转义语法,所以我搜索了一下,发现并成功测试了以下内容:

  • SQL Server,Sybase ASE,Sybase SQL Anywhere

    INSERT INTO lob_table VALUES (0x01FF);
    
    Run Code Online (Sandbox Code Playgroud)
  • DB2

    -- Use a blob constructor. This is not needed for VARCHAR FOR BIT DATA types
    INSERT INTO lob_table VALUES (blob(X'01FF'));
    
    Run Code Online (Sandbox Code Playgroud)
  • Derby,H2,HSQLDB,Ingres,MySQL,SQLite

    INSERT INTO lob_table VALUES (X'01FF');
    
    Run Code Online (Sandbox Code Playgroud)
  • 神谕

    -- 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'));
    
    Run Code Online (Sandbox Code Playgroud)
  • 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);
    
    Run Code Online (Sandbox Code Playgroud)

    有关Postgres十六进制编码的更多详细信息,请参阅AH的答案

  • SQL标准

    -- SQL actually defines binary literals as such 
    -- (as implemented by DB2, Derby, H2, HSQLDB, Ingres, MySQL, SQLite):
    <binary string literal> ::=
      X <quote> [ <space>... ] 
      [ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote>
    
    <hexit> ::=
      <digit> | A | B | C | D | E | F | a | b | c | d | e | f
    
    Run Code Online (Sandbox Code Playgroud)

  • 很好的编译。请注意,Oracle的字符文字限制为4000个字符,这也适用于hextoraw()函数。那限制了最大。您可以这样创建的Blob的大小。 (2认同)
  • @LukasEder是的你是对的,`INSERT INTO tBlob(cID,cBlob)VALUE("1",CAST(X'010203'AS BLOB))`实际上适用于Derby.我的问题似乎与[Flyway](http://flywaydb.org)有关.BTW:没有强制转换它不起作用,它返回:`ERROR 42821:'BLOB'类型的列不能保存'CHAR()FOR BIT DATA'类型的值.这是根据Derby规范预期的. (2认同)