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
arrow
arrow
    文章標籤
    MSSQL sql server
    全站熱搜
    創作者介紹
    創作者 小攻城師 的頭像
    小攻城師

    小攻城師的戰場筆記

    小攻城師 發表在 痞客邦 留言(0) 人氣()