2009-11-06 82 views
4

我的MySQL數據庫可以存儲歐元符號就好(因爲我已經用本地MySQL客戶端(HeidiSQL)測試過)。但是使用MySQL .NET連接器,我的ASP.NET應用程序正在使用我無法插入也沒有從數據庫讀取它:我只得到一個?性格回來。可能的原因是什麼?MySQL ::連接器/淨歐元符號

+0

或許已經回答了在這裏太:http://stackoverflow.com/questions/1703636/how-to-store-euro-symbol-in-mysql-database – Gonzalo 2009-11-14 06:13:44

回答

5

我建議明確指定您的連接字符串中的編碼:

Server = localhost; Database = schema; Uid = foo; Pwd = bar; CharSet = utf8;

它通常可以解決大多數與MySQL的Connector/NET相關的編碼問題。

+2

對我無效 – akosch 2009-11-06 14:11:31

+0

charset參數僅影響從應用程序發送的查詢;返回結果的字符集不受影響。你確定包含歐元符號的表格的排序是正確的嗎?如果您將歐元符號放入標記爲UTF-8的表格中,表示爲不正確的單字節,則MySQL不會發出抱怨(它不會正確整理)。一個Unicode樸素的客戶端(也許HeidiSQL是?)會檢索該字節並將其錯誤地視爲歐元,但Connector/NET會嘗試並將其視爲UTF-8。 – bobince 2009-11-06 14:29:42

+0

我使用utf8_unicode_ci作爲表 – akosch 2009-11-06 14:37:18

0

以下.NET命令編碼這些爲你的數據庫,然後將其解碼成原始符號...

System.Web.HttpUtility.HtmlEncode() 

System.Web.HttpUtility.HtmlDecode() 
+6

存儲HTML-在數據庫中編碼字符串是一個非常糟糕的主意。數據庫級字符串操作(如子字符串和比較)將失敗。而且,HtmlEncode不會對拉丁字母-1範圍之外的Unicode字符進行實體編碼。 – bobince 2009-11-06 14:24:10

-1

您是否正確地在輸出頁面中設置了字符集? 即像<META http-equiv="Content-Type" content="text/html; charset=UTF-8">charset=iso-8859-15但不charset=iso-8859-1

+0

根據iso-8859-1 Unicode€將顯示爲「¬¬」,這絕對不是「?」。 – sanmai 2009-11-13 12:52:00

2

我想說的是,MySQL .NET連接器上設置連接一些整理相關的環境變量;在HeidiSQL和.NET上比較這些查詢的輸出:

SHOW VARIABLES LIKE "character_set_%"; 
SHOW VARIABLES LIKE "collation_%"; 

它們都應該包含utf8-內容。如果沒有,您可以在運行時as in the manual更改它們。

0

想必您將歐元符號插入到鍵入爲NVARCHAR的字段中,否則您將無法正確插入和檢索其他客戶端的歐元符號?

您是否在SQL語句中使用正確的語法來插入和檢索Unicode數據?

要做到這一點,你必須在任何字符串是unicode之前使用N說明符字符,否則它將默默轉換爲單字節編碼併成爲不可讀字符,例如

//Inserting Unicode data 
MySqlCommand cmd = new MySqlCommand(); 
cmd.CommandText = "INSERT INTO SOME_TABLE (someField) VALUES (N'@text')"; 
cmd.Parameters.Add("text", "Some Unicode Text"); 
cmd.Connection = conn; 
cmd.ExecuteNonQuery(); 

//Selecting Unicode data 
MySqlCommand select = new MySqlCommand(); 
select.CommandText = "SELECT * FROM SOME_TABLE WHERE someField=N'@text'"; 
cmd.Parameters.Add("text", "Some Unicode Text"); 
cmd.Connection = conn; 
//Execute your query and process your Results... 
0

我有一個類似的問題,試圖從Sybase 12.5數據導入到MS SQL Server 2005的

基本上MSSQL商店英鎊,歐元跡象VARCHAR罰款,如果他們是正確的編碼,這是偉大,但我沒有意識到的是,Sybase輸出的數據是windows-1252(西歐),而不是UTF-8,這導致數據如英鎊和歐元符號被導入程序翻譯爲「?」。告訴導入程序傳入數據編碼爲1252解決了問題。

如果您在閱讀數據庫時將數據庫的輸出編碼爲1252,則應該輸出正確的符號。

例如:

System.Text.Encoding enc = System.Text.Encoing.GetEncoding(1252); 
MySqlDataReader msdr = command.ExecuteReader(); 
while(msdr.Read()) 
{ 
    ... 
    string val = enc.GetString(enc.GetBytes(msddr.GetString(mssdr.GetOrdinal("varhcar_field")))); 
    ... 
}