close
今天有個頁面吐出 HTTP 500,錯誤訊息是 SQL Server 的定序衝突:
PHP Fatal error: Uncaught PDOException: SQLSTATE[42000]: [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]無法解析 equal to 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_CS_AS" 之間的定序衝突。
問了一下發現是我們原本的資料庫預設值是 Chinese_Taiwan_Stroke_CI_AS,根據《Microsoft SQL Server 的定序和字元集》,這表示「Chinese-Taiwan-Stroke、不區分大小寫、區分重音、不區分假名、不區分寬度」。
但是有個 table 因為欄位的情況特殊,內容值大小寫表示不同意義,所以必須使用區分大小寫的 Chinese_Taiwan_Stroke_CS_AS,在異動時沒有注意到其他資料會來相互比對,就被嚴格的 MSSQL 噴錯誤啦。
原本的 SQL 是:
select * from table_a a
left join table_b b
WHERE a.COL_ID = b.COL_ID
必須為要比較的欄位加上定序,以此例是讓它們統一為不分大小寫的 Chinese_Taiwan_Stroke_CI_AS:
select * from table_a a
left join table_b b
WHERE a.COL_ID COLLATE Chinese_Taiwan_Stroke_CI_AS = b.COL_ID COLLATE Chinese_Taiwan_Stroke_CI_AS
文章標籤
全站熱搜
留言列表