sqlserver 修改某張表某字段 排序規則;sqlserver 中文問號?;sqlserver 生僻字;sqlserver COLLATE用法;


問題:sqlserver查詢中文:䱗、 䱨 ,查不出來!

而且在后綴名.sql 和.txt文件保存變成問號,需要將編碼改為為UTF-8,才能正確保存。

一、測試案例:

create table t2(
id int,
name nvarchar(50) not null,
)
insert into t2 values(1,N'好')
insert into t2 values(2,N'的')
insert into t2 values(3,N'䱗')
insert into t2 values(4,N'䱨')
--注意insert一定要帶N,且字符串類型為nvarchar,否則sqlserver顯示是問號?
select *from t2 where name =N'䱗'
結果錯誤
3 䱗
4 䱨
--等同於查詢空字符串
select *from t2 where name =N''
3 䱗
4 䱨

--解決方案一:修改某張表某個字段的排序規則
ALTER TABLE t2 ALTER COLUMN name nvarchar(50) COLLATE Chinese_PRC_BIN --中文簡體 二進制排序規則
select *from t2 where name =N'䱗'
結果正確
3 䱗
--注意如果此時name 字段not null會變成null,要改回來。

--但是不能用下面的sql語句,這會導致排序規則變成Chinese_PRC_CI_AS,只能用表設計器(選中表-右鍵-設計-改為非空)。
ALTER TABLE t2 ALTER COLUMN name nvarchar(50) not null

--解決方案二:
--如果不想修某張表某個字段的排序規則,可以查詢是添加 COLLATE Chinese_PRC_BIN
--先恢復成原始排序規則
ALTER TABLE t2 ALTER COLUMN name nvarchar(50) COLLATE Chinese_PRC_CI_AS -- 中文簡體 不區分大小寫、區分重音、不區分假名、不區分全半角
select * from t2 where name = N'䱨' COLLATE Chinese_PRC_BIN
查詢結果正確:
4 䱨

--解決方案三:
--創建的時候 直接設置某張表某字段排序規則
delete from t2
create table t1(
id int,
name varchar(50) collate Chinese_PRC_BIN --not null 需要另外設置
)
ALTER TABLE t2 ALTER COLUMN name nvarchar(50) not null

 

--解決方案四: 針對Entity Framework 6 (沒有去測試)
1直接寫存sql參數化語句查詢

string  name="䱨"

var sql = "select * from t2 where name like N'%@name%' or [name2] like N'%@name%'" 

// 如果@name有問題可以嘗試

string  name=“%”+“䱨”+“%” 

var sql = "select * from t2 where name like N'@name' or [name2] like N'@name'" 

或string  name=  “N‘%䱨%’”  

var sql = "select * from t2 where name like @name or [name2] like @name" 

var sqlParams = new SqlParameter[]
{
 new SqlParameter("@name",System.Data.SqlDbType.Nvarchar) {Value= name}
};
var data = db.Database.SqlQuery<t2Temp>(sql, sqlParams);

t2Temp是數據接收類,能存儲查詢結果就行。

2、sql非參數化查詢語句

string  name="䱨"

var sql = "select * from t2 where name like N'%"+name+"%' or [name2] like N'%"+name+"%'" 

var data = db.Database.SqlQuery<t2Temp>(sql, sqlParams);

但要注意對name做校驗,防止sql注入攻擊。


--解決方案五: 針對Entity Framework Core (沒有去測試)
1查詢中的顯式排序規則
var customers = context.Customers
.Where(c => EF.Functions.Collate(c.Name, "SQL_Latin1_General_CP1_CS_AS") == "John")  //sql排序規則可能不對應
.ToList();

2列排序規則
使用EF Core管理數據庫架構時,以下內容將 屬性的 列配置為不區分大小寫,而該數據庫已配置為區分 Name 大小寫:
modelBuilder.Entity<Customer>().Property(c => c.Name)
.UseCollation("SQL_Latin1_General_CP1_CI_AS");

3數據庫排序規則
使用EF Core管理數據庫架構時,模型的 方法中的以下內容將SQL Server OnModelCreating 數據庫配置為使用區分大小寫的排序規則:
modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");

 

--注意 多字段或查詢會出問題 
drop table t2
create table t2(
id int,
name nvarchar(50) collate Chinese_PRC_BIN, 
name2 nvarchar(50) not null 
)
insert into t2 values(1,N'好',N'管控')
insert into t2 values(2,N'的',N'根據')
insert into t2 values(3,N'䱗',N'開天眼')
insert into t2 values(4,N'䱨',N'返回')
select * from t2
select * from t2 where name like N'%䱗%' or name2 LIKE N'%䱗%'
結果如下:
1 好 管控
2 的 根據
3 䱗 開天眼
4 䱨 返回
解決方案是:
1不改數據庫每次查詢都帶上Chinese_PRC_BIN
select * from t2 where name like N'%䱗%' or [name2] like N'%䱗%' collate Chinese_PRC_BIN
結果如下:
3 䱗 開天眼
2把所有where條件出現的字段 排序規則都改為 Chinese_PRC_BIN
ALTER TABLE t2 ALTER COLUMN name2 nvarchar(50) COLLATE Chinese_PRC_BIN
select * from t2 where name like N'%䱗%' or [name2] like N'%䱗%'
結果如下:
3 䱗 開天眼

 

相關文檔:

COLLATE語法介紹

https://docs.microsoft.com/zh-cn/sql/t-sql/statements/collations?view=sql-server-ver15

sqlserver 排序規則介紹:

https://docs.microsoft.com/zh-cn/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15

EF6、EFCode 排序規則介紹

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/collations-and-case-sensitivity

https://www.bookstack.cn/read/ef-core-zh/36b68308cefb1f5b.md

同類文章:

SQL SERVER 生僻字查詢問題和關鍵字COLLATE

https://blog.csdn.net/sinat_28984567/article/details/109253444

https://blog.csdn.net/johnf_nash/article/details/78947219

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM