SQL Server的 排序规则(collation)冲突和解决方案

RDMA性能调优实战:如何用ib_*命令榨干你的Mellanox网卡带宽? 本文深入探讨了如何利用ib_*命令工具集对RDMA网络进行深度性能调优,以充分释放Mellanox网卡的带宽潜力。文章从理解Send/Write/Read三种核心通信原语的差异入手,逐步指导读者通过调整消息大小、队列深度、内联数据等关键参数,并结合系统级的NUMA绑定、中断亲和性等优化策略,实现从基准测试到逼近硬件极限的性能提升。 阅读详情
什么是排序规则(collation)

 

关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多

2010121145642

这些排序规则有什么作用呢?让我们先来看看MS官方的解释:

排序规则指定了表示每个字符的位模式。它还指定了用于排序和比较字符的规则。排序规则具有下面的特征:

  • 语言
  • 区分大小写
  • 区分重音
  • 区分假名

比如在SQL Server 2005中,排序规则名称由两部份构成,比如 Chinese_PRC_CI_AI_WS
前半部份是指本排序规则所支持的字符集,如Chinese_PRC 指针对大陆简体字UNICODE的排序规则。
后半部份即后缀的含义如下:

 

_BIN               
指定使用向后兼容的二进制排序顺序。
_BIN2      指定使用 SQL Server 2005 中引入的码位比较语义的二进制排序顺序。
_Stroke   按笔划排序
_CI(CS)是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS)是否区分假名类型,KI不区分,KS区分
_WI(WS)是否区分全半角,WI不区分,WS区分

 

既然排序规则如此复杂,那么应用了不同排序规则的列之间默认情况下便不能进行Union、Join、Like等equal操作了,于是便有了排序规则(collation)冲突。

 

排序规则(collation)冲突

 

我们知道,SQL Server 从2000 开始,便支持多个排序规则。SQL Server 2000 的数据库可使用除默认排序规则以外的其他排序规则。此外,SQL Server 2000 还支持为列专门制定排序规则。

这样一来,我们在写跨表、跨数据库、跨服务器操作的T-SQL时,如果equal的字段排序规则不同,便会发生排序规则冲突。

比如我们先见两个结构相同的表,但字段的排序规则不同:

            -- 1. Create TableA.
            CREATE TABLE TagsTableA
            (
                TagName        NVARCHAR(64)    COLLATE Chinese_PRC_BIN
            )   
            -- 2. Create TableB.
            CREATE TABLE TagsTableB
            (
                TagName        NVARCHAR(64)    COLLATE Chinese_PRC_CI_AS
            )   

当表建好之后执行:

            -- 3. Try to join them
            SELECT * from TagsTableA A INNER JOIN TagsTableB B on A.TagName = B.TagName 

便会出下类似下面的问题:

无法解决 equal to 操作中 "Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。

 

常见的场景——临时表

 

我们知道,SQL Server的临时表是保存在Tempdb数据库中的。而使用临时表的数据库与临时表的排序规则(conllation)不一定相同。所以,当Tempdb的排序规则与当前使用临时表的数据库排序规则不同时,便会出现排序规则冲突。

一般来说,我们在创建临时表时可能不会注意到排序规则,从而留下排序规则冲突的隐患。

比如Openlab V4.0的Blog模块中的一个存储过程,便有着这种隐患:

/****** 对?象ó:  StoredProcedure [blogs].[up_CreateGetTagIds]    脚本日期: 01/20/2010 19:10:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*
RETURN VALUES:
    Ids
*/
-- =============================================
-- Author:        <Lance Zhang>
-- Create date: <2010-01-06>
-- Description: <Make sure all the tag EXISTS in DB, and then get their ids.>
-- 1. Create Temp Table.
-- 2. Insert TagNames into Temp Table.
-- 3. Add new Tags to [Categories] from query Temp Table.
-- 4. Batch Get All Tag Ids from [Categories].
-- 5. Clear and drop Temp Table.
-- =============================================
ALTER PROCEDURE [blogs].[up_CreateGetTagIds]
(
    @BlogId                INT,
    @TagNames            XML
)
AS
BEGIN
    /******************************* SET CONFIG *************************************************/
    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SET NUMERIC_ROUNDABORT OFF

    /******************************* DECLARE VARIABLE *************************************************/

    /********************************BEGIN TRANSATION**********************************************/

    BEGIN TRY

        BEGIN TRANSACTION;

            -- 1. Create Temp Table.
            CREATE TABLE #TagsTable
            (
                TagName        NVARCHAR(64)    
            )   

            -- 2. Insert TagNames into Temp Table.
            INSERT INTO 
                #TagsTable 
            SELECT 
                TG.Tags.value('@i','NVARCHAR(64)') AS TagName
            FROM 
                @TagNames.nodes('/ts/t') TG(Tags) 

            -- 3. Add new Tags to [Categories] from query Temp Table.
            BEGIN
                INSERT INTO 
                    [Categories]
               (
                    [BlogId]
                    ,[ParentId]
                    ,[CategoryType]
                    ,[CategoryName]
                    ,[LoweredCategoryName]
                    ,[Slug]
                    ,[LoweredSlug]
                    ,[Description]
                    ,[CreatedDateUtc]
                    ,[TotalEntities]
                    ,[SortOrder]
                    ,[State]
                )
                SELECT
                    @BlogId,
                    0,                                    -- ParentId, 0 as default.
                    2,                                    -- CategoryType, 2 as Post Tag.
                    TT.TagName,
                    LOWER(TT.TagName),
                    TT.TagName,                            -- Slug, use CategoryName as default.
                    LOWER(TT.TagName),                    -- LoweredSlug, use LoweredCategoryName as default.
                    '',                                    -- Description, Empty as default.
                    GETUTCDATE(),
                    0,                                    -- TotalEntities, 0 as default.
                    1,                                    -- SortOrder of PostTags can always be 1.
                    1                                    -- State, 1 as Normal.
                FROM
                    #TagsTable TT
                WHERE
                    LOWER(TT.TagName) NOT IN 
                    (
                        SELECT 
                            C.[LoweredCategoryName] 
                        FROM 
                            [Categories] C WITH( UPDLOCK, HOLDLOCK )
                        WHERE 
                            [BlogId] = @BlogId
                            AND [CategoryType] = 2        -- Post Tag.    
                    )

            END

            -- 4. Batch Get All Tag Ids from [Categories].
            BEGIN
                SELECT
                    [CategoryId]
                FROM
                    [Categories] C WITH(NOLOCK)
                JOIN
                    #TagsTable TT
                ON 
                    C.[LoweredCategoryName] = LOWER( TT.TagName )
                WHERE
                    C.[BlogId] = @BlogId 
                    AND C.[CategoryType] = 2                -- Post Tag.
                    AND C.[State] = 1                        -- 1 as Normal status.
            END

            -- 5. Clear and drop Temp Table.
            TRUNCATE TABLE 
                #TagsTable
            DROP TABLE 
                #TagsTable

        COMMIT TRANSACTION;
        RETURN 1

    END TRY

    BEGIN CATCH
        IF XACT_STATE() <> 0
        BEGIN
            ROLLBACK TRANSACTION;
            RETURN -1
        END
    END CATCH
END
GO

常见的解决方案

 

知道了什么是排序规则冲突,我们接下来分析冲突的解决方案,以数据库级别的排序规则为例,一般来说,解决方案有下面几种

  1. 把SQL实例删了重建 ——大多数情况下等于没说-_-|||
  2. 修改数据库的排序规则 ——参考阿牛兄的这篇文章
  3. 在T-SQL中使用COLLATE DATABASE_DEFAULT来解决冲突 ——接下来主要讨论这个

 

COLLATE DATABASE_DEFAULT

 

Collate XXX 操作可以用在字段定义或使用时,它会将字段定义或转换成XXX 的排序规则格式。而Collate Database_Default 则会将字段定义或转换成当前数据库的默认排序规则,从而解决冲突。

比如在下面的代码中便使用了Collate Database_Default 来解决字段在equal操作中的排序规则冲突:

        Insert into Security.Report (Name)
              Select C.Path From SSRS.Catalog C 
        Where C.Path Collate Database_Default Like @ReportPath + '/%' 
              And C.Path Collate Database_Default Not In (Select Name From Security.Report R)
        

当然,在创建临时表时若对字段定义加上Collate Database_Default ,也可以方便地解决潜在的排序规则冲突,比如上一节中提到的存储过程,只要做如下修改即可。

            -- 1. Create Temp Table.
            CREATE TABLE #TagsTable
            (
                TagName        NVARCHAR(64)    COLLATE DATABASE_DEFAULT
            )   

结束语
Apache Kafka Connect任意文件读取漏洞(CVE-2025-27817) 由于Apache Kafka客户端未对用户输入进行严格验证和限制,未经身份验证的攻击者可通过构造恶意配置读取环境变量或磁盘任意内容,或向非预期位置发送请求,提升REST API的文件系统/环境/URL访问权限。(CVE-2025-27817) 阅读详情

相关推荐

Anaconda启动失败,一直在loading application的问题

实战基础新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本

Tristan的博客 2771

MSSQL Server 排序规则详解

什么是排序规则(collation)   关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式。它还指定

mx5721的专栏 1280

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

SQL之COLLATE 子句 排序规则

SQL之COLLATE 子句 排序规则

jhfyuf的博客 4476

完整指南:从基础到高级使用 Semantic Kernel

通过本文的学习,你已经掌握了从基础到高级的使用方法。安装并配置。使用简单的文本生成和自然语言处理任务。利用任务链和工具扩展构建复杂的工作流。通过记忆管理上下文,创建更智能的应用。扩展多模态处理能力,集成图像和音频分析。将应用部署到云端,并通过 Azure Functions 提供智能服务。无论是构建简单的对话应用,还是创建多模态智能服务,都提供了强大的工具和灵活的扩展机制。希望这篇文章能帮助你更好地理解并运用这个框架,构建出更加智能和高效的应用。

net core ,前端 ,python 全栈开发 2806

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4370

SQL Server排序规则不一致 - Collate Database_Default

http://www.cnblogs.com/chencidi/archive/2014/07/02/3820386.html 使用多库查询时会出现排序规则冲突的问题 解决办法 在字段后面添加Collate Database_Default

weixin_33875839的博客 1304

macOS Monterey官方镜像高速下载指南(附迅雷链接+兼容性清单)

本文提供macOS Monterey官方镜像的高速下载指南,重点介绍利用迅雷等工具加速下载官方安装包的有效方法。同时,详细列出了系统兼容性清单,帮助用户在下载前确认设备支持,并分享了从下载、验证到安全安装的完整流程与常见问题解决方案。

j7k8l的博客 2190

mysql表collate冲突_SQL Server的 排序规则(collation)冲突和解决方案

什么是排序规则(collation)关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式。它还指定了用于排序和比较字符的...

weixin_35949256的博客 890

c++2048小游戏编写

最近编写了一个小游戏,叫作2048,用到了面向对象的知识。

一个学生的博客 2373

Exposure Fusion

MertensTMO原理详解: 文章:2007年Exposure Fusion 论文链接:http://ntp-0.cs.ucl.ac.uk/staff/j.kautz/publications/exposure_fusion.pdf 论文代码:C版本:https://github.com/JawThrow/ExposureFusion python版本:https://github.com/lzocro/Exposure-Fusion matlab版本:https://github.com/Mericam

大长腿不解释 1653

SQL Server排序规则(collation)冲突和解决方案

什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大...

cla0803的博客 1086

关于爬虫源影视资源设置

本文介绍了Omnibox 2.1.3版本的爬虫脚本配置方法,重点演示了如何添加猫眼资源数据源。脚本包含完整的API请求处理、数据格式化、视频详情获取和弹幕匹配等功能模块。通过环境变量配置采集站API地址和弹幕API地址,支持视频列表获取、分类检索、详情查询和播放地址解析等功能。脚本采用模块化设计,包含完善的错误处理和日志记录机制,能够将采集站返回的数据转换为标准格式,并支持批量获取视频详情来丰富数据。同时提供了弹幕匹配功能,可根据视频文件名或播放地址自动匹配相关弹幕资源。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 4678

SQL Server排序规则(collation)冲突和解决方案[转]

什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式。它还指定了...

weixin_30627381的博客 148

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sql mysql 冲突_SQL Server的排序规则(collation)冲突和解决方案

什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多。 这些排序什么是排序规则(collation)关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要...

weixin_39588223的博客 422

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SQL Server的 排序规则(collation)冲突和解决方案[转]

关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式。它还指定了用于排序和比较字符的规则。排序规...

weixin_30781775的博客 150

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: .net Windows服务程序和安装程序制作图解 (转)
下一篇: Javascript学习笔记
ulark
博客等级 码龄17年 31粉丝 530原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值