SET @test = 'test';
SELECT COERCIBILITY(@test), COERCIBILITY('test');
--- ---
2 4
從documentation:
COERCIBILITY(str)
返回值具有以下表中所示的含義。較低的值具有較高的優先級。
Coercibility Meaning Example
0 Explicit collation Value with COLLATE clause
1 No collation Concatenation of strings with different collations
2 Implicit collation Column value
3 System constant USER() return value
4 Coercible Literal string
5 Ignorable NULL or an expression derived from NULL
COERCIBILITY定義了將在排序規則衝突的情況下,被轉換成什麼樣。
具有較高可壓縮性的表達式將轉換爲較低的可壓縮性表達式的排序規則。
此功能對排除故障排除問題很有用。例如,這兩個查詢以不同的順序返回結果。
這一個:
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT 'X'
) q
ORDER BY
col;
----
'test'
'X'
這一個:
SET @t := 'X' COLLATE UTF8_BIN;
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
----
'X'
'test'
爲什麼會這樣?
DATABASE()
是一個系統函數,其返回值的可執行性爲3
,默認數據庫排序規則爲UTF8_GENERAL_CI
。
第一個查詢中的'X'是一個具有4
的強制性的字符串文字。
的UNION
的結果將總是具有所有值的至少可壓縮性(即,3
)和表達式的與所述至少coersibility歸類:
SELECT col, COERCIBILITY(col), COLLATION(col)
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT 'X'
) q
ORDER BY
col;
--------
'test', 3, 'utf8_general_ci'
'X', 3, 'utf8_general_ci'
在第二查詢,@t
是一個保存帶排序規則的字符串值的變量UTF8_BIN
。由於其強制性低於系統函數的強制性,因此它是結果集中使用的變量的排序規則。
可壓縮性的變量是2
,所以結果的可壓縮性是可變的,以及整理:
SET @t := 'X' COLLATE UTF8_BIN;
SELECT col, COERCIBILITY(col), COLLATION(col)
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
--------
'X', 2, 'utf8_bin'
'test', 2, 'utf8_bin'
你所看到的行爲是因爲MySQL變量不區分大小寫,所以@ a和@A是相同的變量。 – longneck 2009-09-17 13:28:01