MSSQL 中“SQL_Latin1_General_CP1_CI_AS“ 和 “Chinese_PRC_CI_AS“ 之间的排序规则冲突

当在SQL查询中遇到'SQL_Latin1_General_CP1_CI_AS'和'Chinese_PRC_CI_AS'排序规则冲突时,可以使用显示转换方法解决。如在多表连接和Select语句中通过COLLATE指定所需排序规则。例如,SELECT * FROM A JOIN B ON A.Name COLLATE Chinese_PRC_CI_AS = B.Name 或 SELECT Name COLLATE Chinese_PRC_CI_AS FROM A。该问题是由于数据库间不同的排序规则设置导致的,若要永久解决,需在数据库级别修改排序规则。

SQL查询时候出现:无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突问题,可以用显示转换的方法解决

COLLATE SQL_collation_name

SQL_collation_name 为SQL SERVE 排序规则名称

1、多表连接中修改排序规则方法

SELECT * FROM  A  JOIN   B ON A.Name COLLATE Chinese_PRC_CI_AS =B.Name

2、Select中修改排序规则的方法

SELECT Name COLLATE Chinese_PRC_CI_AS FROM A

产生这个问题主要的原因,是因为两个数据库的排序规则不同而导致的。如果需要彻底解决,需要直接在数据库中修改DB的排序规则。

 

 

### 问题原因 虽然 SQL Server 的字符集为 `Chinese_PRC_CI_AS`,但仍出现中文乱码问题,可能有以下原因: - **数据库连接字符编码问题**:数据库连接 URL 未正确指定字符编码,导致数据在传输过程中出现乱码。 - **实体类属性与数据库字段类型不匹配**:实体类中存储中文的属性类型与数据库表中对应的字段类型不兼容,无法正确存储中文。 - **代码生成器配置问题**:MyBatis-Plus 代码生成器未指定正确的字符编码,可能影响生成的实体类中文注释的显示。 - **字符编码过滤器缺失**:Spring Boot 项目中未添加字符编码过滤器,导致请求响应的字符编码不一致。 ### 解决办法 - **数据库连接配置**:确保数据库连接 URL 中指定了正确的字符编码。在 `application.properties` 或 `application.yml` 中添加字符编码配置: ```properties spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=yourDatabase;characterEncoding=UTF-8 ``` ```yaml spring: datasource: url: jdbc:sqlserver://localhost:1433;databaseName=yourDatabase;characterEncoding=UTF-8 ``` - **实体类属性类型**:确保实体类中存储中文的属性类型为 `String`,并且在数据库表中对应的字段类型为 `NVARCHAR` 或 `NTEXT`。 ```java import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @TableName("your_table_name") public class YourEntity { @TableField("your_column_name") private String yourProperty; // 其他属性方法 } ``` - **代码生成器配置**:如果使用了 MyBatis-Plus 的代码生成器,确保生成器的配置中指定了正确的字符编码。 ```java import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import java.nio.charset.StandardCharsets; import java.util.Collections; FastAutoGenerator.create("jdbc:sqlserver://localhost:1433;databaseName=yourDatabase;characterEncoding=UTF-8", "username", "password") .globalConfig(builder -> { builder.outputDir("src/main/java") .fileOverride() .charset(StandardCharsets.UTF_8); }) .packageConfig(builder -> { builder.parent("com.example") .moduleName("yourModule") .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mapper")); }) .strategyConfig(builder -> { builder.addInclude("your_table_name"); }) .templateEngine(new FreemarkerTemplateEngine()) .execute(); ``` - **字符编码过滤器**:在 Spring Boot 项目中添加字符编码过滤器,确保请求响应的字符编码为 `UTF-8`。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CharacterEncodingFilter; @Configuration public class EncodingConfig { @Bean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); return filter; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值