gpt4 book ai didi

java - 将字节值与 postgresql 中的 bytea 列进行比较

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:55 24 4
gpt4 key购买 nike

我使用 PostgreSQL 作为我的数据库和 java servlet 来与 PostgreSQL 通信。我的应用程序要求我从数据库中获取数据以匹配输入文件。所有文件都存储在数据库中的 bytea 列中。这是我的代码:

String checkdb="select * from key where certificate = '"+c+"';";
Statement stcheck=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet newrs=stcheck.executeQuery(checkdb);
newrs.last();
int rowcount=newrs.getRow();
if(rowcount!=0)
throw new ArithmeticException();

其中 certificate 是包含 bytea 数据的列的名称,c(已上传)是 byte[] 形式的证书。所以我在这里检查上传的证书是否已经存在于数据库中。如果它存在,那么我将抛出异常。

但问题是多次上传同一个证书不会抛出异常,就像两个证书不同一样。

我是否正确地比较了字节值。我应该怎么做才能纠正这个问题?
编辑
我尝试将证书列设置为主键。但是证书仍然被插入到数据库中。怎么会这样?内部比较也由于某种原因失败。
编辑
我尝试检索一个文件并将其转换为字符串:

InputStream input13 = retrs.getBinaryStream("certificate");
ByteArrayOutputStream output13 = new ByteArrayOutputStream();
byte buf[]=new byte[1024];
int len;
IOUtils.copy(input13, output13);
input13.close();
byte[] retvalue=output13.toByteArray();
String s1=new String(retvalue);

String s2=new String(c);
System.out.println("in--------------"+s2);


System.out.println("out----------------"+s1);


retrs 是包含刚刚存储的证书的结果集。 c是byte[]中的输入证书。我得到的输出是:

19:05:43,156 INFO  [STDOUT] in-------------------BEGIN CERTIFICATE-----
MIICIjCCAYsCAQMwDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCYXMxCzAJBgNV
BAgMAmFzMQswCQYDVQQHDAJhczELMAkGA1UECgwCYXMxCzAJBgNVBAsMAmFzMQsw
CQYDVQQDDAJjYTERMA8GCSqGSIb3DQEJARYCYXMwHhcNMTIwNDEwMDY0ODQ3WhcN
MTMwNDEwMDY0ODQ3WjBSMQswCQYDVQQGEwJhczELMAkGA1UECBMCYXMxCzAJBgNV
BAcTAmFzMQswCQYDVQQKEwJhczELMAkGA1UECxMCYXMxDzANBgNVBAMTBmNsaWVu
dDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsfJq9TVgTLqz84nuWpDm+dvI
do2HIWoHkmEPNowK4xn1+qWUPCy30aASWI92YMtE6njtQGyZBYij0iTAxldDktqd
bMdpKAONDlSv71rn+fZPuyenbBFYZexybNVsRMFzTD/F/hiPPXT7E1j9CrgIMxVz
ScZeNATh/dPLwuNQ0dsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQDDUyeIWlKaMMkM
8VRGuDJyKFC8miQfmul6zE4+6RTswHKjcUoje2vhTQgV+GBfqx8ai+ziujx8CeyR
eJWcb1G8gg+LMUNDcTOlXTeBG9L2c/gMOEu7BEjtpojSYmFyEvJEQ5Yep44HKZZb
FSPFVNxGiXBhNxtKQdAu6/smQ/eBNg==
-----END CERTIFICATE-----
19:05:43,156 INFO [STDOUT] out----------------[B@17f8b39


是我检索错误的方式。因为 [B@17f8b39 看起来像一个内存位置或类似的东西。
回答
正如@jarnbjo 所说,必须牢记一件事。当你在 postgressql 中使用字节数组时,无论是 retieving 还是 inserting 都只使用 setBytes() 。否则只有字节的内存位置(java 中的哈希码) [] 被插入。

最佳答案

使用 PreparedStatement:

PreparedStatement pstat = conn.prepareStatement(
"select * from key where certificate = ?");
pstat.setBytes(1, c);
ResultSet newrs = pstat.executeQuery();

插入数据时当然也应该这样做。

关于java - 将字节值与 postgresql 中的 bytea 列进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com