http://twpug.net/docs/mysql323/manual_Reference.html#CHAR
7.3.7
字符串類型
字符串類型是CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。
7.3.7.1 CHAR和VARCHAR類
型
CHAR和VARCHAR類型是類似的,但是在他們被儲存和檢索的方式不同。
一個CHAR列的長度被修正為在你創造表時你所聲明的長度。長度可以是1和255之間的任何值。(在MySQL
3.23中,CHAR長度可以是0~255。) 當CHAR值被儲存時,他們被用空格在右邊填補到
指定的長度。當CHAR值被檢索時,拖後的空格被刪去。
在VARCHAR列中的值是變長字符串。你可以聲明一個VARCHAR列是在1和255之間
的任何長度,就像對CHAR列。然而,與CHAR相反,VARCHAR值
只儲存所需的字符,外加一個字節記錄長度,值不被填補﹔相反,當值被儲存時,拖後的空格被刪去。(這個空格刪除不同於ANSI
SQL規範。)
如果你把一個超過列最大長度的值賦給一個CHAR或VARCHAR列,值被截斷以適合它。
下表顯示了兩種類型的列的不同,通過演示儲存變長字符串值到CHAR(4)和VARCHAR(4)列:
| 值 | CHAR(4) | 儲存需求 | VARCHAR(4) | 儲存需求 |
'' | ' ' | 4 個字節 | '' | 1 字節 |
'ab' | 'ab ' | 4 個字節 | 'ab' | 3 個字節 |
'abcd' | 'abcd' | 4 個字節 | 'abcd' | 5 個字節 |
'abcdefgh' | 'abcd' | 4 個字節 | 'abcd' | 5 個字節 |
從CHAR(4)和VARCHAR(4)列檢索的值在每種情況下都是一樣的,因為拖後的空格
從檢索的CHAR列上被刪除。
在CHAR和VARCHAR列中儲存和比較值是以大小寫不區分的方式進行的,除非當桌子被創
建時,BINARY屬性被指定。BINARY屬性意味著該列的值根據MySQL伺
服器正在運行的機器的ASCII順序以大小寫區分的方式儲存和比較。
BINARY屬性是“粘性”的。這意味著,如果標記了BINARY的列用於一個表達式中,整
個的表達式作為一個BINARY值被比較。
MySQL在表創建時可以隱含地改變一個CHAR或VARCHAR列
的類型。見7.7.1
隱含的的列說明改變。
7.3.7.2 BLOB和TEXT類
型
一個BLOB是一個能保存可變數量的數據的二進制的大對像。4個BLOB類型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅
僅在他們能保存值的最大長度方面有所不同。見7.3.1
列類型儲存需求。
4個TEXT類型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對
應於4個BLOB類型,並且有同樣的最大長度和儲存需求。在BLOB和TEXT類
型之間的唯一差別是對BLOB值的排序和比較以大小寫敏感方式執行,而對TEXT值是大小寫不敏感
的。換句話說,一個TEXT是一個大小寫不敏感的BLOB。
如果你把一個超過列類型最大長度的值賦給一個BLOB或TEXT列,值被截斷以適合它。
在大多數方面,你可以認為一個TEXT行列是你所希望大的一個VARCHAR列。同樣,你可
以認為一個BLOB列是一個VARCHAR 列。差別是:
BINARY
- 用MySQL版本3.23.2和更新,你能在
BLOB和TEXT列
上索引。更舊的MySQL版本不支援這個。
- 當值被儲存時,對
BLOB和TEXT列沒有拖後空格的刪除,因為對VARCHAR列
有刪除。
BLOB和TEXT列不能有DEFAULT值。
MyODBC定義BLOB為LONGVARBINARY,TEXT值
為LONGVARCHAR。
因為BLOB和TEXT值可以是非常長的,當使用他們時,你可能遇到一些限制:
- 如果你想要在一個
BLOB或TEXT列上使用GROUP BY或ORDER,你必須將列值變換成一個定長對像。這樣做的標準方法是用
BYSUBSTRING函數。例如:mysql> select comment from tbl_name,substring(comment,20) as substr ORDER BY substr;
如果你不這樣做,在排序時,只有列的首
max_sort_length個字節被使用,預設的max_sort_length是
1024﹔這個值能在啟動mysqld伺服器時使用-O選擇改變。你可以在包含BLOB或TEXT值
得一個表達式上分組(group),通過指定列的位置或使用一個別名:
mysql> select id,substring(blob_col,1,100) from tbl_name
GROUP BY 2;
mysql> select id,substring(blob_col,1,100) as b from tbl_name
GROUP BY b; - 一個
BLOB或TEXT對像的最大尺寸由其類型決定,但是你能在客戶與伺服器之間是實
際傳輸的最大值由可用的內存數量和通訊緩衝區的大小來決定。你能改變消息緩衝區大小,但是你必須在伺服器和客戶兩端做。見10.2.3
調節伺服器參數。
注意,每個BLOB或TEXT值內部由一個獨立分配的對像表示。這與所有的其他列類型相反,
它們是在打開表時,按列被分配一次儲存。
7.3.7.3 ENUM類
型
一個ENUM是一個字符對像,其值通常從一個在表創建時明確被列舉的允許值的一張表中選擇。
在下列的某個情形下,值也可以空字符串("")或NULL:
- 如果你把一個無效值插入到一個
ENUM(即,一個不在允許的值列表中的字符串),空字符串作為一個特殊錯誤的值被
插入。
- 如果一個
ENUM被聲明為NULL,NULL也是列的合法
值,並且預設值是NULL。如果一個ENUM被聲明為NOT,預設值是允許值的列表的第一成員。
NULL
每枚舉值有一個編號:
- 在列說明中來自允許成員值列表值用從1開始編號。
- 空字符串錯誤值的編號值是0。這意味著,你能使用下列
SELECT語句找出被賦給無效ENUM值
的行:mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL值的編號是NULL。
例如,指定為ENUM("one", "two", "three")的列可以有顯示在下面的值的任何一個。每個值的編
號也被顯示:
| 值 | 編號 |
NULL | NULL |
"" | 0 |
"one" | 1 |
"two" | 2 |
"three" | 3 |
枚舉可以有最大65535個成員。
當你把值賦給一個ENUM列時,字母的大小寫是無關緊要的。然而,以後從列中檢索的值大小寫匹配在表創建時用來指定允許
值的值的大小寫。
如果你在一個數字的上下文環境中檢索一個ENUM,列值的編號被返回。如果你儲存一個數字到一個ENUM中,
數字被當作一個標號,並且儲存的值是該編號的枚舉成員。
ENUM值根據列說明列舉的枚舉成員的次序被排序。(換句話說,ENUM值根據他們的編號數
字被排序)
例如,對ENUM("a", "b"),"a"排在"b"前面,但是對ENUM("b",排在
"a"),"b""a"前面。空字符串排序非空字符串之前,並且NULL排在所
有其他枚舉值之前。
如果你想要得到一個ENUM列的所有可能的值,你應該使用:SHOW 並且分析在第二列的
COLUMNS FROM table_name LIKE enum_column_nameENUM定
義。
7.3.7.4 SET類
型
一個SET是可以有零或多個值的一個字符串對像,其每一個必須從表創建造被指定了的允許值的一張列表中被選擇。由多個集
合成員組成的SET列通過由由逗號分隔(“,”)的成員被指定,其推論是該SET成
員值不能包含逗號本身。
例如, 一個指定為SET("one", "two") NOT NULL的列可以有這些值的任何一個:
""
"one"
"two"
"one,two"
一個SET能有最多64個不同的成員。
MySQL用數字值儲存SET值,儲存值的低階位對應於第一個集合成員。如果你在數
字上下文中檢索一個SET值,檢索的值把位設置位對應組成列值的集合成員。如果一個數字被儲存進一個SET列,
在數字的二進制表示中設置的位決定了在列中的集合成員。假定一個列被指定為SET("a","b","c","d"),那麼成
員有下列位值:
SET 成員 | 十進制的值 | 二進制的值 |
a | 1 | 0001 |
b | 2 | 0010 |
c | 4 | 0100 |
d | 8 | 1000 |
如果你給該列賦值9,即二進制的1001,這樣第一個和第四個SET值
成員"a"和"d"被選擇並且結果值是"a,d"。
對於包含超過一個SET成員的值,當你插入值時,無所謂以什麼順序列舉值,也無所謂給定的值列舉了多少次。當以後檢索值
時,在值中的每個成員將出現一次,根據他們在表創建時被指定的順序列出成員。例如,如果列指定為SET("a","b","c","d"),
那麼"a,d"、"d,a"和"d,a,a,d,d"在檢索時將均作為"a,d"出
現。
SET值以數字次序被排序。NULL指排在非NULL SET值之前。
通常,你使用LIKE操作符或FIND_IN_SET()函數執行在一個SET上
的一個SELECT:
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
但是下列也會工作:
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
這些語句的第一個語句尋找一個精確的匹配。第二個尋找包含第一個集合成員的值。
如果你想要得到一個SET列的所有可能的值,你應該使用:SHOW 並且分析在第二列的
COLUMNS FROM table_name LIKE set_column_nameSET定
義。
沒有留言:
張貼留言