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
定
義。
沒有留言:
張貼留言