Сравнение типов BLOB-объектов в PreparedStatement - PullRequest
0 голосов
/ 08 августа 2011

Я использую базу данных Derby. Я написал этот запрос:

InputStream is = new java.io.ByteArrayInputStream(BYTES);
PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob =?)");
st11.setBlob(1,is,BYTES.length);

dBlob - это тип данных BLOB. BYTES также тип данных BLOB.

Но я получаю следующее исключение при выполнении этого запроса:

Причина: ОШИБКА 42818: Сравнения между BLOB и BLOB не поддерживаются. Типы должны быть сопоставимы. Типы строк также должны иметь сопоставления. Если со llation не совпадает, возможное решение - использовать операнды, чтобы заставить их сортировка по умолчанию (например, ВЫБЕРИТЕ имя таблицы ИЗ sys.systables WHERE CAST (таблица ename AS VARCHAR (128)) = 'T1')

Как написать запрос, чтобы обойти эту проблему?

Я также пытался использовать Convert, но он тоже не работает:

PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob    
=CONVERT(?,BINARY)");
st11.setBlob(1,is,BYTES.length);

Кроме того, возможно ли получить тип данных передаваемого аргумента? отражением или каким-либо другим способом.

1 Ответ

2 голосов
/ 11 августа 2011

Невозможность поиска непосредственно по столбцу BLOB является очень фундаментальным ограничением, и я не думаю, что вы сможете его обойти.

Если ваше приложение требует, чтобы вы регулярно выполняли поиск в базе данных по точному совпадению по данным BLOB, я обычно делаю в своих приложениях добавление дополнительного столбца в базу данных типа VARCHAR (128) и сохранение SHA-1 хэш значения BLOB в столбце хеша.

Затем для поиска в вашей базе данных вычислите хэш большого двоичного объекта, который вы хотите найти, и найдите в столбце хеша точное совпадение.

...