同样的SQL,有的库能查出来,有的库查不出来?问题可能出在排序规则上!
大家好。今天来聊聊一个容易被忽视但非常重要的数据库设置——排序规则(Collation)。
你是否遇到过这样的情况:
这些问题都跟排序规则有关。
一、什么是排序规则?
排序规则决定了SQL Server如何处理:
大小写:abc = ABC?
重音:café = cafe?
假名类型:日语的平假名和片假名是否等同?
字符宽度:全角字符和半角字符是否等同?
二、最常用的两个设置
1. 大小写不敏感(推荐大多数场景)
USE [master] GO ALTER DATABASE [你的数据库名] COLLATE Chinese_PRC_CI_AI GO
效果:查询'abc'能匹配到'ABC'、'Abc'、'aBc'
2. 大小写敏感(需要精确匹配时)
USE [master] GO ALTER DATABASE [你的数据库名] COLLATE Chinese_PRC_CS_AI GO
三、排序规则命名规则
排序规则名称由三部分组成:语言_前缀_后缀
Chinese_PRC_CI_AI_WS└─┬─┘ └┬┘ └┬┘ └┬┘ │ │ │ └── WS:区分宽度 │ │ └────── AI:不区分重音 │ └────────── CI:不区分大小写 └─────────────── 简体中文
后缀含义速查
| | |
|---|
| CI | | 'A' = 'a' |
| CS | | 'A' ≠ 'a' |
| AI | | 'é' = 'e' |
| AS | | 'é' ≠ 'e' |
| KS | | |
| KI | | |
| WS | | 'A'(全角) ≠ 'A'(半角) |
| WI | | 'A'(全角) = 'A'(半角) |
四、常用排序规则参考
五、查看当前排序规则
SELECT SERVERPROPERTY('Collation') AS 服务器排序规则SELECT name, collation_name FROM sys.databases WHERE name = DB_NAME()SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAMEFROM INFORMATION_SCHEMA.COLUMNSWHERE COLLATION_NAME IS NOT NULL
六、实际应用场景
场景1:修复大小写敏感问题
ALTER DATABASE UserDB COLLATE Chinese_PRC_CI_AS
场景2:联查时排序规则冲突
SELECT * FROM db1.Users u1JOIN db2.Users u2 ON u1.Name = u2.NameSELECT * FROM db1.Users u1JOIN db2.Users u2 ON u1.Name = u2.Name COLLATE Chinese_PRC_CI_ASALTER DATABASE db2 COLLATE Chinese_PRC_CI_AS
场景3:密码验证(区分大小写)
SELECT * FROM Users WHERE Username = @username AND Password = @password AND Password COLLATE Chinese_PRC_CS_AS = @password
七、修改排序规则的注意事项
⚠️ 重要提醒
完整修改步骤
BACKUP DATABASE MyDB TO DISK = 'D:\Backup\MyDB.bak'ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATEALTER DATABASE MyDB COLLATE Chinese_PRC_CI_ASALTER DATABASE MyDB SET MULTI_USERUSE MyDBEXEC sp_recompile N'所有用户表'
八、创建新数据库时指定排序规则
CREATE DATABASE MyNewDBCOLLATE Chinese_PRC_CS_AS
九、查询级别临时指定排序规则
SELECT * FROM Users WHERE Name = 'admin' COLLATE Chinese_PRC_CS_ASSELECT Name, Name COLLATE Chinese_PRC_CS_AS AS SensitiveNameFROM Users
十、常见问题排查
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS 排序规则
十一、快速对照表
十二、总结
| |
|---|
| CI/CS | |
| AI/AS | |
| Chinese_PRC_CI_AS | |
| |
一句话:CI不区分大小写(宽松),CS区分大小写(严格),大多数业务系统选Chinese_PRC_CI_AS就对了!
阅读原文:原文链接
该文章在 2026/4/27 15:10:11 编辑过