比較字節值我使用PostgreSQL作爲我的數據庫和Java Servlet的與PostgreSQL打交道。我的應用程序要求我從數據庫中獲取匹配輸入文件的數據。所有文件都存儲在數據庫的bytea列中。這是我的代碼:用bytea的列在PostgreSQL中
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[]
形式的證書。所以我在這裏檢查上傳的證書是否已經存在於數據庫中。如果它存在,我就拋出一個例外。
但問題是相同的證書多次上傳不拋出異常的工作,就好像兩個證書是不同的。
我是比較正確的字節值。我該怎麼做才能糾正這個問題?
EDIT
我嘗試設置證書列作爲主鍵。但仍然將證書插入到數據庫中。這怎麼會發生?由於某種原因,內部比較也失敗。
EDIT
我試圖檢索Ile和它轉換成字符串:
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是字節[]中的輸入證書。該出來把我得到的是:
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----------------[[email protected]
是我的錯檢索方式。因爲[[email protected]
看起來像內存位置或類似的東西。
答案
正如@jarnbjo所說有一件事必須記住。當你在postgressql中使用字節數組時,無論是使用retieving or inserting
,只使用setBytes()
。只有字節[]的內存位置(java中的哈希碼)被插入。
什麼版本的PostgreSQL這是什麼?什麼是JDBC驅動程序的jar文件? (使用驅動程序的舊主版本可能比服務器有問題。) – kgrittn
@kgrittn:我的jar版本 - postgresql-8.4-703.jdbc3.jar和我的postgresql版本8.4。 – Ashwin