• home > DB > MSSQL >

    ms slq server排序规则冲突(collation conflict)问题如何解决

    Author:zhoulujun Date:

    今天发现一个sql server 排序报错问题{"code":"EREQUEST","message":"selectROW_NUMBER()OVER(ORDERBYu created_atdesc)asrownum,[prospe

    今天发现一个sql server 排序报错问题

    {"code":"EREQUEST","message":"select ROW_NUMBER() OVER (ORDER BY u.created_at desc) as rownum, [prospects].[id] as [id], [prospects].[email], [prospects].[first_name], [prospects].[last_name], [prospects].[chinese_name], [prospects].[status], [prospects].[referral], [prospects].[created_by], [u].[created_at], [u].[last_login_at], [app].[status] as [application_status], [ct].[email] as [manager_email], [ct].[display_name] as [manager_display_name], [ct].[agent_code] as [manager_code], [zn].[region_code], [zn].[district_code], [zn].[unit_code], [o].[status] as [offer_status], [o].[summary] as [offer_summary] from [prospects] left join [users] as [u] on [prospects].[user_id] = [u].[id] left join [users] as [ct] on [prospects].[created_by] = [ct].[id] left join [zones] as [zn] on [zn].[id] = [prospects].[zone_id] left join [applications] as [app] on [app].[prospect_id] = [prospects].[id] left join (select\n    *\n  from\n    (\n    SELECT\n      o.*,\n      ROW_NUMBER() OVER (\n            PARTITION BY o.prospect_id\n    ORDER BY\n      CASE\n        WHEN o.type = 20 THEN 1\n        ELSE 2\n      END,\n      o.status DESC\n        ) AS Rank\n    FROM\n      offers o\n) as b\n  where\n    b.Rank = 1) as o on [prospects].[id] = [o].[prospect_id] where [prospects].[region] = @p0 and [ct].[agent_code] in (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17, @p18, @p19, @p20, @p21, @p22, @p23, @p24, @p25, @p26, @p27, @p28, @p29, @p30, @p31, @p32, @p33, @p34, @p35, @p36, @p37, @p38, @p39, @p40, @p41, @p42) and [zn].[region_code] = @p43 - Cannot resolve the collation conflict between \"SQL_Latin1_General_CP1_CI_AS\" and \"Chinese_Hong_Kong_Stroke_90_CI_AI_KS_SC_UTF8\" in the equal to operation."}

    这个错误信息表明在执行SQL查询时,发生了排序规则冲突(collation conflict)。具体来说,查询中涉及的两个列或表达式的排序规则(collation)不一致,导致无法进行比较操作。

    默认的SQL_Latin1_General_CP1_CI_AS

    Chinese_Hong_Kong_Stroke_90_CI_AI_KS_SC_UTF8 是 SQL Server 中的一种排序规则,主要用于支持 香港地区 的中文字符集和语言环境。具体特点如下:

    • Chinese_Hong_Kong_Stroke_90:表示适用于香港的中文字符集,基于笔画排序。

    • CI:Case Insensitive(不区分大小写)。

    • AI:Accent Insensitive(不区分重音)。

    • KS:Kanatype Sensitive(区分假名类型,适用于日语)。

    • SC:Supplementary Characters(支持补充字符,如表情符号)。

    • UTF8:使用 UTF-8 编码。

    因此,这种排序规则主要适用于 香港地区 的应用程序,特别是需要处理繁体中文和 UTF-8 编码的场景。


    可以使用下面sql 查询 sql server的字符集

    SELECT SERVERPROPERTY('Collation') AS ServerCollation;

    也可以直接

    SELECT name, collation_name FROM sys.databases WHERE name = 'yourDB';

    或者

    SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = 'yourDB';

    一般情况是导入数据不一致,或者排序设置不一致


    修改数据库排序字符集

    -- 修改排序规则
    ALTER DATABASE YourDatabaseName
    COLLATE SQL_Latin1_General_CP1_CI_AS;
    
    -- 重建索引和约束
    USE YourDatabaseName;
    EXEC sp_msforeachtable 'ALTER INDEX ALL ON ? REBUILD';
    
    -- 验证修改
    SELECT name, collation_name
    FROM sys.databases
    WHERE name = 'YourDatabaseName';

    容器初始化达时候修改

    version: '3.8'
    
    services:
      mssql:
        image: mcr.microsoft.com/mssql/server:2022-latest
        container_name: mssql_server
        environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=YourStrong!Passw0rd
          - MSSQL_COLLATION=Chinese_Hong_Kong_Stroke_90_CI_AI_KS_SC_UTF8
        ports:
          - "1433:1433"
        volumes:
          - mssql-data:/var/opt/mssql
        restart: always
    
    volumes:
      mssql-data:

    或者自己修改sql查询语句,一般不做推荐……



    转载本站文章《ms slq server排序规则冲突(collation conflict)问题如何解决》,
    请注明出处:https://www.zhoulujun.cn/html/DB/MSSQL/9485.html