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

時常發生這樣的狀況:繁體數據庫,需要保存簡體的字符;或簡體的數據庫,保存繁體的字符。

解決方案是把欄位的屬性設定成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‘“,保存后不會出現亂碼,而且,在數據庫查詢到的結果,跟保存時的結果是一樣的字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值