假设我要避免在JDBC中使用绑定变量,而要使用“ ad-hoc”语句运行SQL,例如:
connection.createStatement().executeQuery("SELECT ...");
是否有任何内联BLOB数据类型的约定/ JDBC转义语法?我知道H2具有以下语法:
INSERT INTO lob_table VALUES (X'01FF');
但这不是标准。有什么一般的解决方案吗?注意,我对通用方法感兴趣。我知道这可能会非常低效。
可能没有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
甲骨文
-- 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