在絕大多數查詢中,MySQL使用哪種校對規則進行比較是很顯然的。例如,在下列情況中,校對規則明顯的是“列x的列校對規則”:
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
但是,當涉及多個操作數時,可能不明確。例如:
SELECT x FROM T WHERE x = 'Y';
這個查詢應該使用列x的 校對規則,還是字符串文字'Y'的 校對規則?
標准化SQL使用“可壓縮性”規則解決這種問題。基本上,這個意思是:既然x和'Y'都有 校對規則,哪個校對規則優先?這可能比較難解決,但是以下規則適合大多數情況:
·一個外在的COLLATE子句可壓縮性是0(根本不能壓縮。)
·使用不同校對規則的兩個字符串連接的可壓縮性是1。
·列校對規則的可壓縮性是2。
·“系統常數”(如USER()或VERSION()函數返回的字符串)可壓縮性是3。
·文字規則的可壓縮性是4。
·NULL或從NULL派生的表達式的可壓縮性是 5。
上述可壓縮性值是MySQL5.1當前所用的。
這樣上述規則可以模糊解決:
·使用最低的可壓縮性值的校對規則。
·如果兩側有相同的可壓縮性,那麼如果校對規則不同則發生錯誤。
例如:
column1 = 'A' 使用column1的校對規則 column1 = 'A' COLLATE x 使用'A'的校對規則 column1 COLLATE x = 'A' COLLATE y 錯誤
使用COERCIBILITY()函數確定一個字符串表達式的可壓縮性:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(VERSION()); -> 3 MySQL> SELECT COERCIBILITY('A'); -> 4
沒有系統常數或可忽略的壓縮性。函數如USER()的可壓縮性是2而不是3,文字的可壓縮性是3而不是4。