我试图在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