【问题标题】:Filtering postgres data using bytea column使用 bytea 列过滤 postgres 数据
【发布时间】:2015-04-22 09:07:05
【问题描述】:

我有一个 Java 应用程序,可以在从供应商处收到库存商品时插入它们。我捕获产品的条形码图像以及其他信息(名称、价格等..)。我在 PostgreSQL 数据库中保存了 bytea 的条形码图像信息。由于我还没有条形码扫描仪,所以我正在拍摄条形码图像并插入如下。

  //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) 列过滤数据?就像条形码扫描仪的工作原理一样。

【问题讨论】:

    标签: java postgresql barcode bytea


    【解决方案1】:

    如果您想在数据库中执行此操作,您需要一个可以从光栅图像(PNG、JPEG 等)解码条形码的库,并且您需要通过过程语言将其公开为 PostgreSQL 函数(PL/Python、PL/Perl、C 等)。

    我个人建议不要在数据库中这样做。将工作交给一个外部辅助进程池,每个辅助进程都会分析代码块并使用图像中的代码(如果有)更新数据库。这为您提供了更多语言选择,将数据库与条形码解码软件中的任何崩溃隔离开来,等等。

    我的第一次搜索找到了zxing,这是一个用于条形码解码的 Java 库。因此,我可能会将它与 PgJDBC 一起使用来生成一个简单的工作进程,该进程获取条形码图像,对其进行解码,并使用解码后的条形码更新行。如果由于某种原因我真的必须在数据库中执行此操作,我会使用 PL/Java(警告,这里是龙)或找到一个条形码解码库以获得更好的数据库内语言支持。

    尝试像您在WHERE 子句中描述的那样做,将完全没有希望。您必须为每个查询中的每个图像解码条形码。完全无法控制。功能索引可以工作,但创建起来会非常昂贵,并且面对条形码库的更新等,维护起来会是一场噩梦。您需要对此进行预处理。

    【讨论】:

      【解决方案2】:

      唯一的方法是扫描条形码图像并将代码存储为 varchar。恕我直言

      【讨论】:

      • 谢谢。是否有可能来自不同供应商的不同库存商品具有相同的代码,因为这会导致冲突?
      • 不幸的是,是的,虽然很少。相同的代码可能会被其他供应商重新用于新产品,因为不再生产原始产品。
      • 好的,那是可以管理的。我曾假设条形码扫描仪的输出是图像。但是根据您的建议,输出似乎是一串字符。不是吗?
      • 是的,代表扫描条码本身的字符串(EAN XY、Code XY 等)。首先,使用zxing(Craig 建议)扫描图像并将结果存储为字符串以使其可查询。
      • 就个人而言,我不会在 SQL Server 上调用任何可能长期存在的外部进程。即使一切顺利,它也可能不必要地延长数据库事务的寿命并增加记录锁定问题的风险。
      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2014-09-02
      • 1970-01-01
      • 2017-06-05
      • 2021-09-18
      • 2021-12-27
      相关资源
      最近更新 更多