Фильтрация данных postgres с использованием столбца bytea
У меня есть Java-приложение, которое вставляет элементы по мере их поступления от поставщика. Я фиксирую изображение продукта со штрих-кодом вместе с другой информацией (название, цена и т. Д.). Я сохраняю информацию о штрих-коде bytea в базе данных PostgreSQL. Поскольку у меня еще нет сканера штрих-кода, я фотографирую изображение штрих-кода и вставляю его следующим образом.
//code extract
File imgFile = new File(barcodeImage.jpg);
FileInputStream fin=new FileInputStream(imgFile);
pstmt2.setBinaryStream(19, fin, (int) imgFile.length()); //inserts into barcodeImage - bytea column
Теперь я хочу получить продукт из базы данных, используя изображение штрих-кода, которое я сохранил. что-то вроде:
select * from stock_item where barcodeImage=***
Как я собираюсь фильтровать данные, используя столбец barcodeImage(bytea)? Так же, как работают сканеры штрих-кода.
2 ответа
Единственный способ - отсканировать изображение штрих-кода и сохранить его как varchar. по моему мнению
Если вы хотите сделать это в базе данных, вам понадобится библиотека, которая может декодировать штрих-коды из растровых изображений (PNG, JPEG и т. Д.), И вам нужно будет представить это как функцию PostgreSQL через процедурный язык (PL/Python, PL/Perl, C и т. Д.).
Лично я рекомендую не делать этого в БД. Передайте работу пулу внешних вспомогательных процессов, каждый из которых анализирует блок кодов и обновляет БД с помощью кода (если есть), найденного на изображении. Это дает вам больший выбор языка, изолирует базу данных от любых сбоев в программном обеспечении для декодирования штрих-кода и т. Д.
Мой первый поиск нашел zxing, библиотеку Java для декодирования штрих-кода. Поэтому я, вероятно, использовал бы это с PgJDBC для создания простого рабочего процесса, который извлекал изображение штрих-кода, декодировал его и обновлял строку с декодированным штрих-кодом. Если бы по какой-то причине мне действительно пришлось сделать это в БД, я бы либо использовал PL/Java (предупреждение, будь здесь драконы), либо нашел бы библиотеку декодирования штрих-кода для лучшего поддерживаемого языка в базе данных.
Пытаясь сделать это так, как вы описали, в WHERE
пункт, будет совершенно безнадежным. Вы должны были бы декодировать штрих-код для каждого изображения в каждом запросе. Совершенно неуправляемый. Функциональный индекс работал бы, но его создание было бы чрезвычайно дорогостоящим, а обслуживание - кошмаром перед лицом обновлений библиотеки штрихкодов и т. Д. Вам необходимо предварительно обработать это.