2009-09-17 28 views
4

所有的用戶變量都有一個隱含的 可壓縮性值強制性是什麼意思? MySQL的用戶變量

是什麼意思呢?這是否有什麼關係...

mysql> SET @a = 1; 
mysql> SET @A = @a; 
mysql> SELECT @a, @A; 
mysql> SELECT @a, @A; 
+------+------+ 
| @a | @A | 
+------+------+ 
| 1 | 1 | 
+------+------+ 
mysql> SET @a = 2; 
mysql> SELECT @a, @A; 
mysql> SELECT @a, @A; 
+------+------+ 
| @a | @A | 
+------+------+ 
| 2 | 2 | 
+------+------+ 

其中@A被分配2可能是因爲它「引用」@a?

+3

你所看到的行爲是因爲MySQL變量不區分大小寫,所以@ a和@A是相同的變量。 – longneck 2009-09-17 13:28:01

回答

8
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' 
+0

只是好奇,這個信息會用於什麼用途? – iceangel89 2009-09-17 14:56:08