2013-10-01 53 views
0

我需要將編碼爲latin-1的數據插入到SQLite數據庫中。 (這是一個外部要求;改變DB或編碼是不是一種選擇。)根據SQLite documentation這應該是可能的:使用latin-1編碼插入數據

SQLite是不講究它接收到的文本,它是不是樂意處理 更多沒有標準化的文本字符串,或者甚至是格式正確的UTF-8或UTF-16。因此,想要存儲IS08859數據的程序員可以使用UTF-8接口。

我可以編碼文字很輕鬆地:

Charset charset = Charset.forName("ISO-8859-1"); 
byte[] data = mystring.getBytes(charset); 

,但我不能看到如何作爲的Statement.executeUpdate需要一個字符串,而不是字節數組插入。

+0

請不要!你會在某個時候感到抱歉! – njzk2

回答

0

編碼的字符串轉換成字節數組與所需編碼和剛運行查詢之前讀回爲(畸形)UTF-8。

String query = "INSERT INTO ..."; 
// Ugly trickery to insert data encoded as latin-1 
query = new String(query.getBytes("ISO-8859-1"), "UTF-8"); 
statement.executeUpdate(query); 
1

雖然您可以假裝您的ISO8859-1字符串是UTF-8字符串,但最好將它們存儲爲斑點。 SQLite將在需要時自動在Blob和字符串之間進行轉換(無論如何內部實現是相同的),並且大多數internal functions在blob而不是字符串上執行時將使用字節索引,這正是您想要的。

斑點與參數處理:

PreparedStatement ps = conn.prepareStatement(
    "INSERT INTO MyTable(Name) VALUES(?)"); 
ps.setBytes(1, data); 
ps.execute(); 
+0

這將需要更改架構,不是嗎?對我來說,這是一個非首發,因爲它是外部定義的。 –

+0

在SQLite中,您可以將blob插入到任何列中而沒有問題;它使用[動態分類](http://www.sqlite.org/datatype3.html)。 –

相關問題