Встроенные BLOB / BINARY типы данных в SQL / JDBC - PullRequest
9 голосов
/ 17 февраля 2012

Скажем, я хочу избежать использования переменных связывания в JDBC и запускать SQL с помощью операторов ad-hoc, например:

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

Существует ли какой-либо условный / условный синтаксис JDBC для встроенных типов данных BLOB?Я знаю, что H2 имеет такой синтаксис :

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

Но это не стандарт.Какие-нибудь общие решения?Обратите внимание, меня интересует общий подход.Я знаю, что это может оказаться ужасно неэффективным.

Ответы [ 2 ]

23 голосов
/ 17 февраля 2012

Скорее всего, нет escape-синтаксиса 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');
    
  • Oracle

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

    См. Ответ А.Х. для получения более подробной информации о шестнадцатеричном кодировании Postgres

  • Стандарт 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
    
3 голосов
/ 17 февраля 2012

Я бы хотел добавить некоторые специфические для PostgreSQL вещи в Ответ Лукаса :

Самое короткое и простое решение (по крайней мере, начиная с PostgreSQL 9.0):

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

без приведения (если столбец уже bytea один) и только одна \\x отметка в самом начале.Это «шестнадцатеричный формат», описанный в разделе Двоичные типы данных .

Относительно синтаксиса X'01FF': согласно документации строковая константа PostgreSQL поддерживает его- для битовых струн.И, похоже, стандартного преобразования битов в байты не существует.

...