top
Loading...
10.3.11.校對確定較為復雜的一些特殊情況
10.3.11. 校對確定較為復雜的一些特殊情況

在絕大多數查詢中,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

見12.9.3節,“信息函數”。

沒有系統常數或可忽略的壓縮性。函數如USER()的可壓縮性是2而不是3,文字的可壓縮性是3而不是4

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/charset.html
北斗有巢氏 有巢氏北斗