ms slq server排序规则冲突(collation conflict)问题如何解决
Author:zhoulujun Date:
今天发现一个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