# [SQL Server] collation衝突 [TOC] :::info 環境 - Spring Boot 3.2.0 - SQL Server - Mybatis ::: ## 原因 call API 時,在 mapper 執行查詢時拋出 SQLServerException 錯誤。 ```=log! Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation. ; uncategorized SQLException; SQL state [S0009]; error code [468]; Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation. ``` 從 SQLServerException 的提示可以確定是欄位 collation 不同產生的問題,大致上有幾種可能: #### 1. 連結不同資料表時,欄位 collation 不一致 ```=sql! SELECT * FROM TableA a JOIN TableB b ON a.Column1 = b.Column2 ``` 如果 `a.Column1` 使用 `SQL_Latin1_General_CP1_CI_AS`,而 `b.Column2` 使用 `Chinese_Taiwan_Stroke_CI_AS`,就會發生錯誤。 #### 2. 在 WHERE 條件中比較不同 collation 的欄位 ```=sql! SELECT * FROM TableA WHERE Column1 = '某個值' ``` 如果 `Column1` 的 collation 和字串 `'某個值'` 預設 collation 不同,也會報錯。 #### 3. UNION 或 JOIN 時合併不同 collation 的欄位 ```=sql! SELECT Column1 FROM TableA UNION SELECT Column2 FROM TableB ``` 如果 `Column1` 和 `Column2` 的 collation 不一致,會報錯。 ## 分析 當 SQL Server 對不同排序規則 (collation) 的欄位進行字串比較(=)時,會因無法直接進行,因此拋出錯誤 * `SQL_Latin1_General_CP1_CI_AS` SQL Server 預設的 Latin1 排序規則,主要用於英語環境。 * `Chinese_Taiwan_Stroke_CI_AS` 繁體中文的筆劃排序規則。 ## 解決 #### 1. 在欄位比較時轉換 適用於無法變動或是臨時查詢 ```=sql! <column_name> COLLATE <collation> = <column_name> // or <column_name> = <column_name> COLLATE <collation> ``` 範例: ```=sql! SELECT FROM TableA a JOIN TableB b ON a.column1 COLLATE Chinese_Taiwan_Stroke_CI_AS = b.column1 ``` #### 2. 修改資料表欄位的 collation 如果是時常需要做比較的欄位,而且不會有太大影響的話,直接變更欄位一勞永逸 ```=sql! ALTER TABLE <table_name> ALTER COLUMN <column_name> <type> COLLATE <collation> ``` 範例: ```=sql! ALTER TABLE TableA ALTER COLUMN Column1 NVARCHAR(100) COLLATE Chinese_Taiwan_Stroke_CI_AS; ``` 資料來源: [定序與 Unicode 支援 - SQL Server](https://learn.microsoft.com/zh-tw/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up