我試圖在oracle數據庫(10克)中保存unicode數據(希臘語)。我創建了一個簡單的表:如何將unicode數據保存到oracle?
alt text http://i25.tinypic.com/dvpqnk.png
我明白,NVARCHAR2總是使用UTF-16編碼所以它必須是罰款所有(人)語言。
然後我試圖在數據庫中插入一個字符串。我用代碼硬編碼了字符串(「你好嗎?」,希臘語)。然後我嘗試從數據庫中取回並顯示它。
class Program
{
static string connectionString = "<my connection string>";
static void Main (string[] args) {
string textBefore = "Τι κάνεις;";
DeleteAll();
SaveToDatabase (textBefore);
string textAfter = GetFromDatabase();
string beforeData = String.Format ("Before: {0}, ({1})", textBefore, ToHex (textBefore));
string afterData = String.Format ("After: {0}, ({1})", textAfter, ToHex (textAfter));
Console.WriteLine (beforeData);
Console.WriteLine (afterData);
MessageBox.Show (beforeData);
MessageBox.Show (afterData);
Console.ReadLine();
}
static void DeleteAll() {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open();
var command = oraConnection.CreateCommand();
command.CommandText = "delete from UNICODEDATA";
command.ExecuteNonQuery();
}
}
static void SaveToDatabase (string stringToSave) {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open();
var command = oraConnection.CreateCommand();
command.CommandText = "INSERT into UNICODEDATA (ID, UNICODESTRING) Values (11, :UnicodeString)";
command.Parameters.Add (":UnicodeString", stringToSave);
command.ExecuteNonQuery();
}
}
static string GetFromDatabase() {
using (var oraConnection = new OracleConnection (connectionString)) {
oraConnection.Open();
var command = oraConnection.CreateCommand();
command.CommandText = "Select * from UNICODEDATA";
var erpReader = command.ExecuteReader();
string s = String.Empty;
while (erpReader.Read()) {
string text = erpReader.GetString (1);
s += text + ", ";
}
return s;
}
}
static string ToHex (string input) {
string bytes = String.Empty;
foreach (var c in input)
bytes += ((int)c).ToString ("X4") + " ";
return bytes;
}
}
這裏有不同的輸出: alt text http://i28.tinypic.com/2wmq9a0.png
控制檯輸出:在消息框中從數據庫中獲取之後 alt text http://i31.tinypic.com/2ymdo2u.png
文本:在消息框中發送到數據庫之前
文本: alt text http://i29.tinypic.com/6xz3px.png
請你可以建議我可能在這裏做錯了嗎?
如果我跳過數據庫並直接顯示字符串,它會正確顯示希臘字符串。我已經更新了關於如何從數據庫中獲取數據的問題。請你可以投入更多的光線嗎? – Hemant 2009-07-28 07:18:05
需要注意的另一件事是,如果我使用SQL Server Express版本並執行相同的操作(替換Linq查詢插入和獲取數據的代碼),它會正確顯示字符串。 – Hemant 2009-07-28 07:22:23
Jon:我已經更新了這個問題(包含控制檯應用程序中的代碼)。它的奇怪,控制檯輸出也擰,但消息框顯示正確... – Hemant 2009-07-28 08:14:20