LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

SQL Server字符集排序规则:大小写敏感设置,让你的查询不再“左右为难“

admin
2026年4月24日 11:59 本文热度 33


同样的SQL,有的库能查出来,有的库查不出来?问题可能出在排序规则上!

大家好。今天来聊聊一个容易被忽视但非常重要的数据库设置——排序规则(Collation)

你是否遇到过这样的情况:

  • 开发环境查询WHERE name = 'abc'能查到ABC,生产环境却查不到?

  • 两个库联查时报错"无法解决排序规则冲突"?

  • 用户输入'张三',数据库里存的是'张 三'(全角空格),死活匹配不上?

这些问题都跟排序规则有关。

一、什么是排序规则?

排序规则决定了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'(半角)

四、常用排序规则参考

排序规则
大小写
重音
宽度
适用场景
Chinese_PRC_CI_AS
不区分
区分
不区分
公司最常用
Chinese_PRC_CS_AS
区分
区分
不区分
密码、代码
Chinese_PRC_CI_AI
不区分
不区分
不区分
宽松匹配
Chinese_PRC_CS_AI
区分
不区分
不区分
账号匹配
Chinese_PRC_CI_AS_WS
不区分
区分
区分
严格业务

五、查看当前排序规则

-- 查看服务器排序规则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:修复大小写敏感问题

-- 问题:用户输入"admin",但数据库存的是"ADMIN",查不到-- 解决:修改数据库为不区分大小写ALTER DATABASE UserDB COLLATE Chinese_PRC_CI_AS


场景2:联查时排序规则冲突

-- 错误:无法解决排序规则冲突SELECT * FROM db1.Users u1JOIN db2.Users u2 ON u1.Name = u2.Name-- 解决1:临时转换SELECT * FROM db1.Users u1JOIN db2.Users u2 ON u1.Name = u2.Name COLLATE Chinese_PRC_CI_AS-- 解决2:修改其中一个库的排序规则(需要评估影响)ALTER 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


七、修改排序规则的注意事项

⚠️ 重要提醒

注意点
说明
需要独占数据库
修改前确保没有其他连接
影响现有数据
字符串列的排序规则会改变
无法回滚
操作前务必备份
索引可能失效

修改后可能需要重建索引

完整修改步骤

-- 1. 备份数据库BACKUP DATABASE MyDB TO DISK = 'D:\Backup\MyDB.bak'-- 2. 设置为单用户模式ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE-- 3. 修改排序规则ALTER DATABASE MyDB COLLATE Chinese_PRC_CI_AS-- 4. 恢复多用户模式ALTER DATABASE MyDB SET MULTI_USER-- 5. 重建索引(可选,建议执行)USE MyDBEXEC sp_recompile N'所有用户表'  -- 实际需要逐个表重建


八、创建新数据库时指定排序规则

-- 创建时直接指定CREATE DATABASE MyNewDBCOLLATE Chinese_PRC_CS_AS


九、查询级别临时指定排序规则

-- 不改变数据库,只在这条查询中生效SELECT * FROM Users WHERE Name = 'admin' COLLATE Chinese_PRC_CS_AS-- 列级别指定SELECT     Name,    Name COLLATE Chinese_PRC_CS_AS AS SensitiveNameFROM Users


十、常见问题排查

-- 问题:查询大小写不敏感,但实际是敏感的?-- 排查当前数据库排序规则SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation'AS 排序规则-- 如果包含CS(Case-Sensitive),就是区分大小写-- 需要改为CI(Case-Insensitive)


十一、快速对照表

你的需求
推荐排序规则
大多数业务系统
Chinese_PRC_CI_AS
用户登录(不区分大小写)
Chinese_PRC_CI_AS
密码验证
查询时临时用CS
代码/ID精确匹配
Chinese_PRC_CS_AS
日志/备注模糊搜索
Chinese_PRC_CI_AI
国际化系统
Latin1_General_CI_AS

十二、总结

要点
说明
CI/CS
最常用,决定大小写是否敏感
AI/AS
决定重音是否敏感
Chinese_PRC_CI_AS
公司最常用的配置
修改需谨慎
先备份,再操作

一句话:CI不区分大小写(宽松),CS区分大小写(严格),大多数业务系统选Chinese_PRC_CI_AS就对了!


阅读原文:原文链接


该文章在 2026/4/27 15:10:11 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号