您的位置:首页 > 数据库

sqlserver 中文簡繁體保存時注意的問題,無法解析 equal to 動作的定序衝突,亂碼

2009-08-12 09:14 399 查看
時常發生這樣的狀況:繁體數據庫,需要保存簡體的字符;或簡體的數據庫,保存繁體的字符。

解決方案是把欄位的屬性設定成nvarchar,或ntext,這樣據說數據庫是以unicode的字符保存的,所以能夠存儲各種字符,當然簡繁體都在內。

然而你會遇到另外一個問題:我是設定了欄位的屬性是nvarchar或是ntext,但是簡體字符保存到繁體欄位中,還是會出現亂碼。需要注意到的一個地方是,字符屬性的欄位,有個屬性叫“定序”(Collation),點開這個屬性,可以發現,如果是繁體的sql,字符默認的定序是windows定序:chinese_taiwan_stroke,如果是簡體的sql,則是:chinese_prc_stroke,該屬性也很奇妙,如果是兩個表之間的關聯,該屬性簡繁體的定序不一致,會導致關聯出錯。

例如:peono是people表簡體字符欄位,而新增了關聯表peo_relation,其中有也有一個peono欄位,則為繁體屬性,這時如果做關聯查詢,你的sql會出錯,

“無法解析 equal to 動作的定序衝突。”

解決方法就是修改這里的屬性,然而,有時不能輕率的修改它,因為它們可能有其他的關聯,

那么用另外的解決方法也可以實現這個關聯

declare @usid nvarchar(10)
set @usid = (select usid from tcomuser where pkid='1')
select @usid as c
select * from item_ex where creater = @usid

在存儲過程中定義過渡變量,利用該變量做關聯,或是利用程式和數據庫的相互調用實現,或更多,具體的方法看具體情況決定。

回來說說保存時亂碼的問題,也是這里的緣故,

這里的解決方法是:保存是在該字符欄位加上“N'”字符來實現字符集的轉換,n相當于程式中強制類型轉換的功能,它會把欄位格式化成unicode的編碼格式,然后再保存。

下面的語句保存,是有區別的:

[C# CODE]//未加“N'”

int j = 0;
for (int i = 1; i < this.gvdata.Rows.Count; i++)
{
string sql = "insert into item_ex(item, [desc], unit, category, spec";
sql += ")";
sql += "values(";
sql += "'" + gvdata.Rows[i].Cells[0].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[1].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[2].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[3].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[4].Text.Trim() + "' ";
sql += ")";

if(SC.MySqlBase.ExecuteSql(sql) > 0){
j++;
}
}

[/C# CODE]

[C# CODE]//加“N'”

int j = 0;
for (int i = 1; i < this.gvdata.Rows.Count; i++)
{
string sql = "insert into item_ex(item, [desc], unit, category, spec";
sql += ")";
sql += "values(";
sql += "'" + gvdata.Rows[i].Cells[0].Text.Trim() + "', ";
sql += "N'" + gvdata.Rows[i].Cells[1].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[2].Text.Trim() + "', ";
sql += "'" + gvdata.Rows[i].Cells[3].Text.Trim() + "', ";
sql += "N'" + gvdata.Rows[i].Cells[4].Text.Trim() + "' ";
sql += ")";

if(SC.MySqlBase.ExecuteSql(sql) > 0){
j++;
}
}

[/C# CODE]

加了“N‘“,保存后不會出現亂碼,而且,在數據庫查詢到的結果,跟保存時的結果是一樣的字符
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: