2010年4月27日 星期二

MySQL 字串類型

http://twpug.net/docs/mysql323/manual_Reference.html#CHAR


7.3.7
字符串類型


字符串類型是CHARVARCHARBLOBTEXTENUMSET


7.3.7.1 CHARVARCHAR


CHARVARCHAR類型是類似的,但是在他們被儲存和檢索的方式不同。


一個CHAR列的長度被修正為在你創造表時你所聲明的長度。長度可以是1和255之間的任何值。(在MySQL
3.23中,CHAR長度可以是0~255。) 當CHAR值被儲存時,他們被用空格在右邊填補到
指定的長度。當CHAR值被檢索時,拖後的空格被刪去。


VARCHAR列中的值是變長字符串。你可以聲明一個VARCHAR列是在1和255之間
的任何長度,就像對CHAR列。然而,與CHAR相反,VARCHAR
只儲存所需的字符,外加一個字節記錄長度,值不被填補﹔相反,當值被儲存時,拖後的空格被刪去。(這個空格刪除不同於ANSI
SQL規範。)


如果你把一個超過列最大長度的值賦給一個CHARVARCHAR列,值被截斷以適合它。


下表顯示了兩種類型的列的不同,通過演示儲存變長字符串值到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列上被刪除。


CHARVARCHAR列中儲存和比較值是以大小寫不區分的方式進行的,除非當桌子被創
建時,BINARY屬性被指定。BINARY屬性意味著該列的值根據MySQL
服器正在運行的機器的ASCII順序以大小寫區分的方式儲存和比較。


BINARY屬性是“粘性”的。這意味著,如果標記了BINARY的列用於一個表達式中,整
個的表達式作為一個BINARY值被比較。


MySQL在表創建時可以隱含地改變一個CHARVARCHAR
的類型。見7.7.1
隱含的的列說明改變


7.3.7.2 BLOBTEXT


一個BLOB是一個能保存可變數量的數據的二進制的大對像。4個BLOB類型TINYBLOBBLOBMEDIUMBLOBLONGBLOB
僅在他們能保存值的最大長度方面有所不同。見7.3.1
列類型儲存需求


4個TEXT類型TINYTEXTTEXTMEDIUMTEXTLONGTEXT
應於4個BLOB類型,並且有同樣的最大長度和儲存需求。BLOBTEXT
型之間的唯一差別是對BLOB值的排序和比較以大小寫敏感方式執行,而對TEXT值是大小寫不敏感
。換句話說,一個TEXT是一個大小寫不敏感的BLOB


如果你把一個超過列類型最大長度的值賦給一個BLOBTEXT列,值被截斷以適合它。


在大多數方面,你可以認為一個TEXT行列是你所希望大的一個VARCHAR列。同樣,你可
以認為一個BLOB列是一個VARCHAR
BINARY
列。差別是:



  • MySQL版本3.23.2和更新,你能在BLOBTEXT
    上索引。更舊的MySQL版本不支援這個。

  • 當值被儲存時,對BLOBTEXT列沒有拖後空格的刪除,因為對VARCHAR
    有刪除。

  • BLOBTEXT列不能有DEFAULT值。



MyODBC定義BLOBLONGVARBINARYTEXT
LONGVARCHAR


因為BLOBTEXT值可以是非常長的,當使用他們時,你可能遇到一些限制:



  • 如果你想要在一個BLOBTEXT列上使用GROUP BYORDER

    BY
    ,你必須將列值變換成一個定長對像。這樣做的標準方法是用SUBSTRING函數。例如:
    mysql> select comment from tbl_name,substring(comment,20) as substr ORDER BY substr;

    如果你不這樣做,在排序時,只有列的首max_sort_length個字節被使用,預設的max_sort_length
    1024﹔這個值能在啟動mysqld伺服器時使用-O選擇改變。你可以在包含BLOBTEXT
    得一個表達式上分組(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;


  • 一個BLOBTEXT對像的最大尺寸由其類型決定,但是你能在客戶與伺服器之間是實
    際傳輸的最大值由可用的內存數量和通訊緩衝區的大小來決定。你能改變消息緩衝區大小,但是你必須在伺服器和客戶兩端做。見10.2.3
    調節伺服器參數


注意,每個BLOBTEXT值內部由一個獨立分配的對像表示。這與所有的其他列類型相反,
它們是在打開表時,按列被分配一次儲存。


7.3.7.3 ENUM


一個ENUM是一個字符對像,其值通常從一個在表創建時明確被列舉的允許值的一張表中選擇。


在下列的某個情形下,值也可以空字符串("")或NULL



  • 如果你把一個無效值插入到一個ENUM(即,一個不在允許的值列表中的字符串),空字符串作為一個特殊錯誤的值被
    插入。

  • 如果一個ENUM被聲明為NULLNULL也是列的合法
    值,並且預設值是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_name
並且分析在第二列的ENUM
義。


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_name
並且分析在第二列的SET
義。


沒有留言:

張貼留言