http://hi.baidu.com/forsona/home
2010年12月31日 星期五
2010年12月29日 星期三
2010年12月26日 星期日
2010年12月25日 星期六
2010年12月15日 星期三
2010年12月13日 星期一
usort with static comparison function
class Thread{
public static function __compare($thread_a, $thread_b){
return $thread_a->posts_numbers > $thread_b->posts_numbers ? 1 : ($thread_a->posts_numbers == $thread_b->posts_numbers ? 0 : -1);
}
}
usort($this->sorted_threads, array('Thread', '__compare'));
http://php.net/manual/en/function.usort.php
usort with static comparison function
class Thread{
public static function __compare($thread_a, $thread_b){
return $thread_a->posts_numbers > $thread_b->posts_numbers ? 1 : ($thread_a->posts_numbers == $thread_b->posts_numbers ? 0 : -1);
}
}
usort($this->sorted_threads, array('Thread', '__compare'));
http://php.net/manual/en/function.usort.php
2010年12月11日 星期六
2010年12月10日 星期五
アマガミ
之前中過キミキス的毒,沒想到現再又陷入アマガミ的泥沼,只能說編劇太有才了(゚∀゚)
我也想當學姐的狗阿(゚д。)
公式:http://www.tbs.co.jp/anime/amagami/index-j.html
WIKI:http://zh.wikipedia.org/zh-tw/%E8%81%96%E8%AA%95%E4%B9%8B%E5%90%BB
アマガミ
之前中過キミキス的毒,沒想到現再又陷入アマガミ的泥沼,只能說編劇太有才了(゚∀゚)
我也想當學姐的狗阿(゚д。)
公式:http://www.tbs.co.jp/anime/amagami/index-j.html
WIKI:http://zh.wikipedia.org/zh-tw/%E8%81%96%E8%AA%95%E4%B9%8B%E5%90%BB
アマガミ
之前中過キミキス的毒,沒想到現在又陷入アマガミ的泥沼,只能說編劇太有才了(゚∀゚)
我也想當學姐的狗阿(゚д。)
公式:http://www.tbs.co.jp/anime/amagami/index-j.html
WIKI:http://zh.wikipedia.org/zh-tw/%E8%81%96%E8%AA%95%E4%B9%8B%E5%90%BB
アマガミ
之前中過キミキス的毒,沒想到現在又陷入アマガミ的泥沼,只能說編劇太有才了(゚∀゚)
我也想當學姐的狗阿(゚д。)
公式:http://www.tbs.co.jp/anime/amagami/index-j.html
WIKI:http://zh.wikipedia.org/zh-tw/%E8%81%96%E8%AA%95%E4%B9%8B%E5%90%BB
2010年12月9日 星期四
正規表示 Regular Expression – RegExp (Perl 相容)
http://webdesign.kerthis.com/post/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA-regular-expression
本文介紹相容於Perl正規表示式(Regular Expression、RegEx)的符號與各種語法:
特殊字元(字串)
.
表示除了換行字元(\n)外的任意字元。(除非在s單列模式下才 . 才可比對\n)
\w
表示任意英文字母及數值字元。
\W
表示\w所接受的字元通通不接受。
\s
表示任意空白字元,如空白鍵及tab鍵。
\S
表示接受任何非空白字元
\d
表示接受任意數字字元
\D
表示任何非數字的字元
\n
表示換行字元
\r
表示return對應的字元
\t
表示tab鍵的字元
\b
比對字的邊界
\B
非字的邊界
\v
vertical Tab
\f
from feed
\nnn
八位元碼為nnn的字元
\xnn
十六位元碼為nn的字元
\unnnn
unicode為nnnn的字元
跳脫字元
\
用來跳脫特殊字元,任何「非數值」的字元可以透過反斜線\代表直接以該字元為樣板宣告。例如\^是表示^這個字元,而非代表字組的起始字元。要跳脫反斜線本身則可用\\來表示。
匹配多個可接受的字元組
[]
例如[ace]表示匹配一個字元而這個字可能是a或c或e。此外,在中括號裡面的特殊字元其特別意義都不再存在,也就是只表示單純字面上的意義。另一方
面,中括號裡面的特殊字元有破折號-及脫字符號^。-代表某一範圍內之字元的意思,如[a-z]表示所有小寫英文字母;而^放在中括號中則表是否定的意
思,如[^a]表示非a之外的任意字元。
擇一、選替 Alternatives
|
當要匹配幾個特定的選擇時,則要使用特殊字元|,其代表擇一的意思。舉例來說,a|b表示字元為a或者為b。使用時需注意前後的次序,因為在|中的字組會優先選擇符合最左邊的項目。
群組 Group
(群組)
例如(abc){2}會匹配abcabc。
抓取、參照、記憶
(expression)
匹配符合的expression並將它抓取進自動命名的群組(命名順序由1開始至23456··)。例如(abc)表示匹配abc並將它記錄到群組1,而你就可以用backreference \1來取出這個抓取到的群組,換句話說\1就是abc。
(?<name>expression)
如果你不喜歡群組自動命名的1,也可以自己來命名,我們將上面例子改寫,(abc)改寫成(?<name>abc),如此就可以將抓取的群組命名為name了,要取出它則用\k<name>。
(?:expression)
此式表示匹配但不抓取它
標位點與零寬比對
為什麼說零寬呢?因為本身並不會對應任何文字,只用來界定位置
^
字串起點。在m多列模式下則包括任何\n字元之後的位置。如^abc為比對符合開頭為abc的字組。
\A
字串起點,無論何種比對模式下(不像^,\A皆不包括任何\n字元之後的位置)。
$
字串結尾。在m多列模式下則包括任何\n字元之前的位置。如abc$為比對符合結尾為abc的字組。
\Z
字串結尾,無論何種比對模式下(即.\Z比對abc\ndef會得f)。
\b
字詞邊界。包括介於\w與\W字元之間的位置,以及自串起點與結尾。如可用「.\b」來比對「c」於「abc」中。
\B
非字詞邊界。
標位點與零寬比對 - Lookaround
什麼是lookahead及lookbehind
assertions?它們是用來搜尋目前pattern之前或之後的字元組,但並不包含match
assertions本身。再更詳細一點,Lookaround有點像是「^」、「$」、「\b」這些特殊字元,即本身並不會對應任何文字,只用來界定位
置,故我們將它們稱做zero-width assertions,我們往下看看lookaround可以做些什麼。
Positive Lookaround
(?=expression)
符合字尾為expression的字組
例:我們可以用\w+(?=ing)來符合字尾為ing的字,但不會包含ing本身,像我們拿來匹配filling這個字得到的就會是fill。
(?<=expression)
符合字首為exp的字組
例:我們可以用(?<=g)\w+來符合字首為g的字,但不會包含g本身,像我們拿來匹配good這個字得到的就會是ood。
Negative Lookaround
(?!expression)
符合字尾沒接expression的字組
(?<!expression)
符合字首沒接expression的字組
描述次數的特殊字元 (量詞)
貪多量詞 (greedy quantifiers)
貪多是什麼意思?簡單的說,比對以「多」為原則。如(ab)+可比對出整個ababababababab。
這類量詞會盡可能的消耗受比對的字串(就是越多越好~),但當消耗過多造成後續樣式比對失敗則會逐漸放棄部分的比對結果,一直到同時滿足後續樣式為止,這個放棄的過程我們稱作「回步(backtrackin)」。
{幾次} 、 {幾次, 到幾次} 、 {幾次以上,}
舉例來說,a{3}代表連續3個a;a{1,3}表示可能是a、aa或aaa;a{1,}則表示a有一個以上。
*
表示指定的字元可以出現任意次數,即0次到無限多次。
+
表示指定的字元重覆至少一次
?
表示指定的字元重覆零次或一次
不貪多(惰性)量詞 (lazy quantifiers)
相反的,即以少(長度最短)為原則。如(ab)+?比對ababababababab結果為ab。
*?
出現0或多次,但以少為原則。
+?
出現1次或多次,但以少為原則。
+?
出現0次或1次,但以少為原則。
支配量詞 (possessive quantifiers)
這有點像貪多量詞,但差在它們不回步,講白一點就是它們就是要「多」。就算後續比對失敗也不管、不讓步。
*+
出現0或多次,不回步。
++
出現1次或多次,不回步。
?+
出現0次或1次,不回步。
{n次}+
至少出現n次,不回步。
{n次,}+
至少出現n次,不回步。
{m次,n次}+
至少出現m次但不超過n次,不回步。
(?>比對樣式) 單體組 Atomic group
不回步,整個比對出來樣文段,在回步時會被視做一個單體,不可以部分被丟棄。例如(?>[abc]+\w\w)可比對出abcabcdd,但比對abcaabbcc會造成失敗,因為abcaabbcc已經被當成「一體」的。
呼~最後來談一下註解還有模式飾詞吧
模式飾詞 Mode modifier (或稱flag)
modifier是用來告訴正規式引擎對於正規表示式的解釋方式。
i
不區分大小寫
m
多列模式,「^」及「$」在此模式下表示\n的相鄰字元
s
單列模式,「.」代表任何字元,包括\n
x
忽略空白字元,容許樣式中出現註解「#···」
U
反轉量詞的貪多性質,「*」變不貪多;而「*?」則變貪多
A
強制從受測字串的起點開始比對
D
強制「$」代表字串結尾,而非\n前的字元,但若有開啟多行模式m則以多行模式為主
u
將正規式與受測字串皆當作UTF-8字元處理
(?mode)
以指定模式來比對後續字串,如(?i)接下來比對不分大小寫
(?-mode)
取消模式,(?i)接下來比對不分大小寫(?-i)接下來回復分大小寫
(?mode:···)
以指定的模式來比對括弧內的樣式
(?-mode:···)
取消模式對括弧內的樣式的影響
\Q······\E
將\Q及\E 之間的特殊字元視作一般字元
(?#···)
括弧內的字串視作註解
#······
在x模式下,#後到列尾的字串都當作是註解
繼續閱讀:
http://perldoc.perl.org/perlre.html
正規表示 Regular Expression – RegExp (Perl 相容)
http://webdesign.kerthis.com/post/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA-regular-expression
本文介紹相容於Perl正規表示式(Regular Expression、RegEx)的符號與各種語法:
特殊字元(字串)
.
表示除了換行字元(\n)外的任意字元。(除非在s單列模式下才 . 才可比對\n)
\w
表示任意英文字母及數值字元。
\W
表示\w所接受的字元通通不接受。
\s
表示任意空白字元,如空白鍵及tab鍵。
\S
表示接受任何非空白字元
\d
表示接受任意數字字元
\D
表示任何非數字的字元
\n
表示換行字元
\r
表示return對應的字元
\t
表示tab鍵的字元
\b
比對字的邊界
\B
非字的邊界
\v
vertical Tab
\f
from feed
\nnn
八位元碼為nnn的字元
\xnn
十六位元碼為nn的字元
\unnnn
unicode為nnnn的字元
跳脫字元
\
用來跳脫特殊字元,任何「非數值」的字元可以透過反斜線\代表直接以該字元為樣板宣告。例如\^是表示^這個字元,而非代表字組的起始字元。要跳脫反斜線本身則可用\\來表示。
匹配多個可接受的字元組
[]
例如[ace]表示匹配一個字元而這個字可能是a或c或e。此外,在中括號裡面的特殊字元其特別意義都不再存在,也就是只表示單純字面上的意義。另一方
面,中括號裡面的特殊字元有破折號-及脫字符號^。-代表某一範圍內之字元的意思,如[a-z]表示所有小寫英文字母;而^放在中括號中則表是否定的意
思,如[^a]表示非a之外的任意字元。
擇一、選替 Alternatives
|
當要匹配幾個特定的選擇時,則要使用特殊字元|,其代表擇一的意思。舉例來說,a|b表示字元為a或者為b。使用時需注意前後的次序,因為在|中的字組會優先選擇符合最左邊的項目。
群組 Group
(群組)
例如(abc){2}會匹配abcabc。
抓取、參照、記憶
(expression)
匹配符合的expression並將它抓取進自動命名的群組(命名順序由1開始至23456··)。例如(abc)表示匹配abc並將它記錄到群組1,而你就可以用backreference \1來取出這個抓取到的群組,換句話說\1就是abc。
(?<name>expression)
如果你不喜歡群組自動命名的1,也可以自己來命名,我們將上面例子改寫,(abc)改寫成(?<name>abc),如此就可以將抓取的群組命名為name了,要取出它則用\k<name>。
(?:expression)
此式表示匹配但不抓取它
標位點與零寬比對
為什麼說零寬呢?因為本身並不會對應任何文字,只用來界定位置
^
字串起點。在m多列模式下則包括任何\n字元之後的位置。如^abc為比對符合開頭為abc的字組。
\A
字串起點,無論何種比對模式下(不像^,\A皆不包括任何\n字元之後的位置)。
$
字串結尾。在m多列模式下則包括任何\n字元之前的位置。如abc$為比對符合結尾為abc的字組。
\Z
字串結尾,無論何種比對模式下(即.\Z比對abc\ndef會得f)。
\b
字詞邊界。包括介於\w與\W字元之間的位置,以及自串起點與結尾。如可用「.\b」來比對「c」於「abc」中。
\B
非字詞邊界。
標位點與零寬比對 - Lookaround
什麼是lookahead及lookbehind
assertions?它們是用來搜尋目前pattern之前或之後的字元組,但並不包含match
assertions本身。再更詳細一點,Lookaround有點像是「^」、「$」、「\b」這些特殊字元,即本身並不會對應任何文字,只用來界定位
置,故我們將它們稱做zero-width assertions,我們往下看看lookaround可以做些什麼。
Positive Lookaround
(?=expression)
符合字尾為expression的字組
例:我們可以用\w+(?=ing)來符合字尾為ing的字,但不會包含ing本身,像我們拿來匹配filling這個字得到的就會是fill。
(?<=expression)
符合字首為exp的字組
例:我們可以用(?<=g)\w+來符合字首為g的字,但不會包含g本身,像我們拿來匹配good這個字得到的就會是ood。
Negative Lookaround
(?!expression)
符合字尾沒接expression的字組
(?<!expression)
符合字首沒接expression的字組
描述次數的特殊字元 (量詞)
貪多量詞 (greedy quantifiers)
貪多是什麼意思?簡單的說,比對以「多」為原則。如(ab)+可比對出整個ababababababab。
這類量詞會盡可能的消耗受比對的字串(就是越多越好~),但當消耗過多造成後續樣式比對失敗則會逐漸放棄部分的比對結果,一直到同時滿足後續樣式為止,這個放棄的過程我們稱作「回步(backtrackin)」。
{幾次} 、 {幾次, 到幾次} 、 {幾次以上,}
舉例來說,a{3}代表連續3個a;a{1,3}表示可能是a、aa或aaa;a{1,}則表示a有一個以上。
*
表示指定的字元可以出現任意次數,即0次到無限多次。
+
表示指定的字元重覆至少一次
?
表示指定的字元重覆零次或一次
不貪多(惰性)量詞 (lazy quantifiers)
相反的,即以少(長度最短)為原則。如(ab)+?比對ababababababab結果為ab。
*?
出現0或多次,但以少為原則。
+?
出現1次或多次,但以少為原則。
+?
出現0次或1次,但以少為原則。
支配量詞 (possessive quantifiers)
這有點像貪多量詞,但差在它們不回步,講白一點就是它們就是要「多」。就算後續比對失敗也不管、不讓步。
*+
出現0或多次,不回步。
++
出現1次或多次,不回步。
?+
出現0次或1次,不回步。
{n次}+
至少出現n次,不回步。
{n次,}+
至少出現n次,不回步。
{m次,n次}+
至少出現m次但不超過n次,不回步。
(?>比對樣式) 單體組 Atomic group
不回步,整個比對出來樣文段,在回步時會被視做一個單體,不可以部分被丟棄。例如(?>[abc]+\w\w)可比對出abcabcdd,但比對abcaabbcc會造成失敗,因為abcaabbcc已經被當成「一體」的。
呼~最後來談一下註解還有模式飾詞吧
模式飾詞 Mode modifier (或稱flag)
modifier是用來告訴正規式引擎對於正規表示式的解釋方式。
i
不區分大小寫
m
多列模式,「^」及「$」在此模式下表示\n的相鄰字元
s
單列模式,「.」代表任何字元,包括\n
x
忽略空白字元,容許樣式中出現註解「#···」
U
反轉量詞的貪多性質,「*」變不貪多;而「*?」則變貪多
A
強制從受測字串的起點開始比對
D
強制「$」代表字串結尾,而非\n前的字元,但若有開啟多行模式m則以多行模式為主
u
將正規式與受測字串皆當作UTF-8字元處理
(?mode)
以指定模式來比對後續字串,如(?i)接下來比對不分大小寫
(?-mode)
取消模式,(?i)接下來比對不分大小寫(?-i)接下來回復分大小寫
(?mode:···)
以指定的模式來比對括弧內的樣式
(?-mode:···)
取消模式對括弧內的樣式的影響
\Q······\E
將\Q及\E 之間的特殊字元視作一般字元
(?#···)
括弧內的字串視作註解
#······
在x模式下,#後到列尾的字串都當作是註解
繼續閱讀:
http://perldoc.perl.org/perlre.html
2010年12月8日 星期三
2010年12月6日 星期一
Sub-pattern Matching in Javascript
I am getting:
result[0] = "<eval>content1</eval>";
result[1] = "<eval>content2</eval>";
I was expecting
result[0] = "content1";
result[1] = "content2";
any suggestion?
Simplest solution is to use the exec method on the RegExp object. e.g.
var str = "<eval>content1</eval>\n<eval>content2</eval>";
var pattern = /<.+>(.*)<\/.+>/mg;
var match;
while ((match = pattern.exec(str)))
{
alert(match[1]);
}
http://markmail.org/message/tlorcsxipkhmjo4z#query:+page:1+mid:w44kinhyc2fs4y2y+state:results
Sub-pattern Matching in Javascript
I am getting:
result[0] = "<eval>content1</eval>";
result[1] = "<eval>content2</eval>";
I was expecting
result[0] = "content1";
result[1] = "content2";
any suggestion?
Simplest solution is to use the exec method on the RegExp object. e.g.
var str = "<eval>content1</eval>\n<eval>content2</eval>";
var pattern = /<.+>(.*)<\/.+>/mg;
var match;
while ((match = pattern.exec(str)))
{
alert(match[1]);
}
http://markmail.org/message/tlorcsxipkhmjo4z#query:+page:1+mid:w44kinhyc2fs4y2y+state:results
2010年12月5日 星期日
2010年12月2日 星期四
36進位 與 toString(36)
還真的有 36 進位 XDDD
<script type="text/javascript">
var t = 36 35;
alert(t.toString(36));
</script>
36進位 與 toString(36)
還真的有 36 進位 XDDD
<script type="text/javascript">
var t = 36 35;
alert(t.toString(36));
</script>
2010年11月15日 星期一
FreeBSD基本及重要指令集
FreeBSD基本及重要指令集
1.指令名稱:man
使用方法:man 預查詢的指令名
功能說明:查詢該指令的詳細用法,有時還可查詢一些非指令的東西
2. 指令名稱:ls (dir)
使用方法:ls 資料夾名
功能說明:觀看指定資料夾下檔案列表,如不加資料夾名則列出目前資料夾
參數說明:-l 功能等同ll 可看到檔案及權限相關資料
-a 列出範圍包含隱藏檔 (剩下的自己man)
補充說明: ls -l 的輸出結果:
drwxr-xr-x 1 oamite oamite 512 Dec 20 20:00 public_html
-rwxr--r-- 2 oamite oamite 12345 Dec 31 15:50 test
前面10個字元依序代表
第1個字元:檔案屬性(d是資料夾;l 是連結;- 一般檔案)
第2~4個字元:擁有者權限(r 讀取;w寫入;x 執行)
第5~7個字元:群組使用者權限
第8~10個字元:其他使用者權限
接著後面的英文字依序為 擁有者 擁有群組(例子裡都是oamite)
再來接的數字為檔案大小;其次為最後修改日期
最後面接的就是檔名了!(如果是捷徑還會所指向的目的)
3.指令名稱:cd (chdir)
使用方法:cd 欲前往的資料夾名
功能說明:前往指定資料夾,如不加資料夾名會到自己的家目錄下
補充說明:資料夾名的二三事
cd /usr/local
這種以 / 開頭的是指從跟目錄開始算的絕對路徑
cd ~oamite/public_html
這種以 ~ 開頭的是指從後接的使用者家目錄開始算的絕對路徑
cd ../
這種以 .. 開頭的是從目前資料夾的上層資料夾開始算的絕對路徑
cd ./public_html/
這種以 . 開頭的表示從目前資料夾開始算起的絕對路徑
cd test/lala/
像這種沒特殊開頭的就是相對於現在位置的相對路徑
4.指令名稱:pwd
使用方法:pwd
功能說明:顯示目前所在的資料夾目錄位置(以根目錄為基準)
5. 指令名稱:cp
使用方法:cp 檔案 目標資料夾
功能說明:複製指定檔案到目標資料夾
參數說明:如需複製資料夾請加參數-R (FreeBSD 5版以後可用 –r )
6. 指令名稱:mv
使用方法:mv 檔案名 目標資料夾 (搬移檔案)
mv 檔案 新檔案名 或 mv 資料夾 新資料夾名 (更名檔案)
功能說明:移動指定檔案到目標資料夾或重新命名檔案或資料夾
7. 指令名稱:rm
使用方法:rm 檔案名
功能說明:刪除指定檔案(永遠都救不回)
參數說明:刪除資料夾 –R (FreeBSD 5版以後可用 –r)
8. 指令名稱:mkdir
使用方法:mkdir 新資料夾名
功能說明:建立指定名稱的資料夾
9. 指令名稱:rmdir
使用方法:rmdir 資料夾名
功能說明:刪除指定名稱的空資料夾(一定要是空資料夾)
10. 指令名稱:cat
使用方法:cat 檔案名
功能說明:將檔案內容直接輸出在標準輸出裝置(就是螢幕)上
11. 指令名稱:ln
使用方法:ln –s 檔案 目標資料夾
功能說明:建立檔案捷徑在目標資料夾,請一律加參數 -s
12. 指令名稱:chown
使用方法:chown 新擁有者:群組名 檔案名(或資料夾名)
功能說明:變更指定檔案或資料夾擁有者和工作群組(必須擁有足夠權限)
13. 指令名稱:chmod
使用方法:chmod 權限設定 檔案名(或資料夾名)
功能說明:改變檔案的相關存取權限
補充說明:權限設定
權限設定的方法約可分為3種
第一.數字 eg.644
第二.加減某個權限 eg.+X
第三.設定某個範圍的權限 eg. u=rwx,go=rx
14. 指令名稱:more
使用方法:more 檔案名
功能說明:純文字分頁瀏覽器,當捲軸捲到最下方時自動跳出
15. 指令名稱:less
使用方法:less 檔案名
功能說明:純文字分頁瀏覽器,只有按q才能跳出
16. 指令名稱:ee
使用方法:ee 檔名
功能說明:文字編輯器,如檔名不建立新檔,如新檔內無任何文字則放棄檔案
17. 指令名稱:su
使用方法:su 使用者
功能說明:變更目前使用者(必須知道欲變成的使用者密碼)
如沒有加欲變成的使用者則視為su root (su root 須在wheel群組)
18. 指令名稱:exit logout
使用方法:直接使用
功能說明:登出(上述兩個指令擇一即可)
19指令名稱:make
使用方法:make 檔名
功能說明:用c語言的編譯器編譯c原始碼
20. 指令名稱:make
使用方法:make 參數
功能說明:在 /usr/ports/ 裡安裝軟體的指令
補充說明:參數
install 安裝目前資料夾的軟體
deinstall 解除安裝目前資料夾的軟體
clean 清除因為安裝此軟體的暫存檔案
其他參數 直接影響Makefile內的參數值並安裝軟體
21. 指令名稱:df
使用方法:df
功能說明:列出磁區的使用狀況
22. 指令名稱:ps
使用方法:ps -aux
功能說明:列出所有使用中的access,不加參數(-aux)則指列出由自己所使用的
23. 指令名稱:top
使用方法:top
功能說明:列出使用中的access並動態更新,要跳出請按 ^C
24. 指令名稱:du
使用方法:du
功能說明:列出所有樹狀子資料夾
25. 指令名稱:kill
使用方法:kill PID
功能說明:砍除該PID的access
26. 指令名稱:chflags
使用方法:chflags 參數 旗標 檔案
功能說明:開啟或關閉檔案的保護旗標,僅能由root使用,詳情自己man
開啟保護後root 也不能更動該檔,除非先關閉保護
27. 指令名稱:ping
使用方法:ping ip (or domain)
功能說明:丟出ICMP封包並等待回覆,以測試網路是否順暢
28. 指令名稱:ifconfig
使用方法:ifconfig
功能說明:列出網路的相關軟硬體狀態 (加參數可修改開啟關閉網路)
29. 指令名稱:shutdown
使用方法:shutdown 參數 時間 (警告訊息)
功能說明:依照參數執行關機的相關事宜,只有root才能用
關閉系統:shutdown –p 0602280000 System will be closed
重開機 :shutdown –r now
踢除除了自己以外的所有使用者:shutdown –k now
30. 指令名稱:reboot
使用方法:reboot
功能說明:立即重開機,只有root能使用
31. 指令名稱:tar
使用方法:tar 參數 完成後的檔名 目標檔名
功能說明:壓縮或解壓縮檔案 參數v可看見過程
壓縮參數 cfz
解壓縮參數 xfz
32. 指令名稱:passwd
使用方法:passwd
功能說明:更改密碼,系統會先要求一次舊密碼,然後兩次新密碼
33. 指令名稱:sockstat
使用方法:sockstat
功能說明:列出開啟中的socket
34. 指令名稱:zcat
使用方法:zcat 由排程壓縮的檔名
功能說明:觀看由排程所壓縮的檔案內容
35. 指令名稱:touch
使用方法:touch 檔名
功能說明:開啟新檔,加參數-t可更改檔案建立日期
36. 指令名稱:adduser rmuser
使用方法:直接使用
功能說明:新增或刪除使用者,會有一步步的說明
37. 指令名稱:date
使用方法:date (yyyyMMddhhmm)
功能說明:列出系統目前時間及時區,加上時間可修改時間
38. 指令名稱:cal
使用方法:cal
功能說明:列出月曆
39. 指令名稱:echo
使用方法:echo string
功能說明:輸出字串至標準輸出
40. 指令名稱:clear
使用方法:clear
功能說明:清除螢幕
41. 指令名稱:systat
使用方法:systat -vm
功能說明:顯示並動態更新所有系統資訊
42. 指令名稱:bg
使用方法:將某指令下達後,按^Z暫停程式,然後再按bg即可丟到背景執行
功能說明:將被暫停的程序丟到背景繼續執行
43. 指令名稱:jobs
使用方法:jobs
功能說明:顯示被丟入在背景執行的所有程序
44. 指令名稱:fg
使用方法:fg %number
功能說明:叫回第number個程序至前景執行
45. 指令名稱:last
使用方法:last
功能說明:列出最近一星期使用者登入狀況
46. 指令名稱:uptime
使用方法:uptime
功能說明:顯示系統開機主機狀況
47. 指令名稱:id
使用方法:id 使用者
功能說明:顯示該使用者的uid gid 和群組,如沒家使用者則列出自己
48. 指令名稱:whereis
使用方法:whereis string
功能說明:用來搜尋檔名符合string的原始碼檔二進位檔或說明檔
49. 指令名稱:find
使用方法:find 資料夾 –name 檔名
功能說明:在資料夾及其子資料夾下搜尋 (還有其他好用參數,詳情請man find)
50. 指令名稱:grep
使用方法:grep 搜尋字串 檔名
功能說明:在檔案內搜尋字串
51. 指令名稱:fsck
使用方法:fsck 磁區名
功能說明:檢查並修復磁區
52. 指令名稱:mount
使用方法:mount磁區名
功能說明:掛載磁區
53. 指令名稱:umount
使用方法:umount磁區名
功能說明:卸載磁區
54. 指令名稱:netstat
使用方法:netstat
功能說明:顯示網路連線狀況
FreeBSD基本及重要指令集
FreeBSD基本及重要指令集
1.指令名稱:man
使用方法:man 預查詢的指令名
功能說明:查詢該指令的詳細用法,有時還可查詢一些非指令的東西
2. 指令名稱:ls (dir)
使用方法:ls 資料夾名
功能說明:觀看指定資料夾下檔案列表,如不加資料夾名則列出目前資料夾
參數說明:-l 功能等同ll 可看到檔案及權限相關資料
-a 列出範圍包含隱藏檔 (剩下的自己man)
補充說明: ls -l 的輸出結果:
drwxr-xr-x 1 oamite oamite 512 Dec 20 20:00 public_html
-rwxr--r-- 2 oamite oamite 12345 Dec 31 15:50 test
前面10個字元依序代表
第1個字元:檔案屬性(d是資料夾;l 是連結;- 一般檔案)
第2~4個字元:擁有者權限(r 讀取;w寫入;x 執行)
第5~7個字元:群組使用者權限
第8~10個字元:其他使用者權限
接著後面的英文字依序為 擁有者 擁有群組(例子裡都是oamite)
再來接的數字為檔案大小;其次為最後修改日期
最後面接的就是檔名了!(如果是捷徑還會所指向的目的)
3.指令名稱:cd (chdir)
使用方法:cd 欲前往的資料夾名
功能說明:前往指定資料夾,如不加資料夾名會到自己的家目錄下
補充說明:資料夾名的二三事
cd /usr/local
這種以 / 開頭的是指從跟目錄開始算的絕對路徑
cd ~oamite/public_html
這種以 ~ 開頭的是指從後接的使用者家目錄開始算的絕對路徑
cd ../
這種以 .. 開頭的是從目前資料夾的上層資料夾開始算的絕對路徑
cd ./public_html/
這種以 . 開頭的表示從目前資料夾開始算起的絕對路徑
cd test/lala/
像這種沒特殊開頭的就是相對於現在位置的相對路徑
4.指令名稱:pwd
使用方法:pwd
功能說明:顯示目前所在的資料夾目錄位置(以根目錄為基準)
5. 指令名稱:cp
使用方法:cp 檔案 目標資料夾
功能說明:複製指定檔案到目標資料夾
參數說明:如需複製資料夾請加參數-R (FreeBSD 5版以後可用 –r )
6. 指令名稱:mv
使用方法:mv 檔案名 目標資料夾 (搬移檔案)
mv 檔案 新檔案名 或 mv 資料夾 新資料夾名 (更名檔案)
功能說明:移動指定檔案到目標資料夾或重新命名檔案或資料夾
7. 指令名稱:rm
使用方法:rm 檔案名
功能說明:刪除指定檔案(永遠都救不回)
參數說明:刪除資料夾 –R (FreeBSD 5版以後可用 –r)
8. 指令名稱:mkdir
使用方法:mkdir 新資料夾名
功能說明:建立指定名稱的資料夾
9. 指令名稱:rmdir
使用方法:rmdir 資料夾名
功能說明:刪除指定名稱的空資料夾(一定要是空資料夾)
10. 指令名稱:cat
使用方法:cat 檔案名
功能說明:將檔案內容直接輸出在標準輸出裝置(就是螢幕)上
11. 指令名稱:ln
使用方法:ln –s 檔案 目標資料夾
功能說明:建立檔案捷徑在目標資料夾,請一律加參數 -s
12. 指令名稱:chown
使用方法:chown 新擁有者:群組名 檔案名(或資料夾名)
功能說明:變更指定檔案或資料夾擁有者和工作群組(必須擁有足夠權限)
13. 指令名稱:chmod
使用方法:chmod 權限設定 檔案名(或資料夾名)
功能說明:改變檔案的相關存取權限
補充說明:權限設定
權限設定的方法約可分為3種
第一.數字 eg.644
第二.加減某個權限 eg.+X
第三.設定某個範圍的權限 eg. u=rwx,go=rx
14. 指令名稱:more
使用方法:more 檔案名
功能說明:純文字分頁瀏覽器,當捲軸捲到最下方時自動跳出
15. 指令名稱:less
使用方法:less 檔案名
功能說明:純文字分頁瀏覽器,只有按q才能跳出
16. 指令名稱:ee
使用方法:ee 檔名
功能說明:文字編輯器,如檔名不建立新檔,如新檔內無任何文字則放棄檔案
17. 指令名稱:su
使用方法:su 使用者
功能說明:變更目前使用者(必須知道欲變成的使用者密碼)
如沒有加欲變成的使用者則視為su root (su root 須在wheel群組)
18. 指令名稱:exit logout
使用方法:直接使用
功能說明:登出(上述兩個指令擇一即可)
19指令名稱:make
使用方法:make 檔名
功能說明:用c語言的編譯器編譯c原始碼
20. 指令名稱:make
使用方法:make 參數
功能說明:在 /usr/ports/ 裡安裝軟體的指令
補充說明:參數
install 安裝目前資料夾的軟體
deinstall 解除安裝目前資料夾的軟體
clean 清除因為安裝此軟體的暫存檔案
其他參數 直接影響Makefile內的參數值並安裝軟體
21. 指令名稱:df
使用方法:df
功能說明:列出磁區的使用狀況
22. 指令名稱:ps
使用方法:ps -aux
功能說明:列出所有使用中的access,不加參數(-aux)則指列出由自己所使用的
23. 指令名稱:top
使用方法:top
功能說明:列出使用中的access並動態更新,要跳出請按 ^C
24. 指令名稱:du
使用方法:du
功能說明:列出所有樹狀子資料夾
25. 指令名稱:kill
使用方法:kill PID
功能說明:砍除該PID的access
26. 指令名稱:chflags
使用方法:chflags 參數 旗標 檔案
功能說明:開啟或關閉檔案的保護旗標,僅能由root使用,詳情自己man
開啟保護後root 也不能更動該檔,除非先關閉保護
27. 指令名稱:ping
使用方法:ping ip (or domain)
功能說明:丟出ICMP封包並等待回覆,以測試網路是否順暢
28. 指令名稱:ifconfig
使用方法:ifconfig
功能說明:列出網路的相關軟硬體狀態 (加參數可修改開啟關閉網路)
29. 指令名稱:shutdown
使用方法:shutdown 參數 時間 (警告訊息)
功能說明:依照參數執行關機的相關事宜,只有root才能用
關閉系統:shutdown –p 0602280000 System will be closed
重開機 :shutdown –r now
踢除除了自己以外的所有使用者:shutdown –k now
30. 指令名稱:reboot
使用方法:reboot
功能說明:立即重開機,只有root能使用
31. 指令名稱:tar
使用方法:tar 參數 完成後的檔名 目標檔名
功能說明:壓縮或解壓縮檔案 參數v可看見過程
壓縮參數 cfz
解壓縮參數 xfz
32. 指令名稱:passwd
使用方法:passwd
功能說明:更改密碼,系統會先要求一次舊密碼,然後兩次新密碼
33. 指令名稱:sockstat
使用方法:sockstat
功能說明:列出開啟中的socket
34. 指令名稱:zcat
使用方法:zcat 由排程壓縮的檔名
功能說明:觀看由排程所壓縮的檔案內容
35. 指令名稱:touch
使用方法:touch 檔名
功能說明:開啟新檔,加參數-t可更改檔案建立日期
36. 指令名稱:adduser rmuser
使用方法:直接使用
功能說明:新增或刪除使用者,會有一步步的說明
37. 指令名稱:date
使用方法:date (yyyyMMddhhmm)
功能說明:列出系統目前時間及時區,加上時間可修改時間
38. 指令名稱:cal
使用方法:cal
功能說明:列出月曆
39. 指令名稱:echo
使用方法:echo string
功能說明:輸出字串至標準輸出
40. 指令名稱:clear
使用方法:clear
功能說明:清除螢幕
41. 指令名稱:systat
使用方法:systat -vm
功能說明:顯示並動態更新所有系統資訊
42. 指令名稱:bg
使用方法:將某指令下達後,按^Z暫停程式,然後再按bg即可丟到背景執行
功能說明:將被暫停的程序丟到背景繼續執行
43. 指令名稱:jobs
使用方法:jobs
功能說明:顯示被丟入在背景執行的所有程序
44. 指令名稱:fg
使用方法:fg %number
功能說明:叫回第number個程序至前景執行
45. 指令名稱:last
使用方法:last
功能說明:列出最近一星期使用者登入狀況
46. 指令名稱:uptime
使用方法:uptime
功能說明:顯示系統開機主機狀況
47. 指令名稱:id
使用方法:id 使用者
功能說明:顯示該使用者的uid gid 和群組,如沒家使用者則列出自己
48. 指令名稱:whereis
使用方法:whereis string
功能說明:用來搜尋檔名符合string的原始碼檔二進位檔或說明檔
49. 指令名稱:find
使用方法:find 資料夾 –name 檔名
功能說明:在資料夾及其子資料夾下搜尋 (還有其他好用參數,詳情請man find)
50. 指令名稱:grep
使用方法:grep 搜尋字串 檔名
功能說明:在檔案內搜尋字串
51. 指令名稱:fsck
使用方法:fsck 磁區名
功能說明:檢查並修復磁區
52. 指令名稱:mount
使用方法:mount磁區名
功能說明:掛載磁區
53. 指令名稱:umount
使用方法:umount磁區名
功能說明:卸載磁區
54. 指令名稱:netstat
使用方法:netstat
功能說明:顯示網路連線狀況
2010年11月14日 星期日
MySQL JOIN
对于不支持全连接full join 的数据库,可以使用,
select a.col1,a.col2,b.col3 from tab1 a left [outer] join tab2 b on a.pk_tab1 = b.pk_tab1
union all
select a.col1,a.col2,b.col3 from tab1 a right [outer] join tab2 b on a.pk_tab1 = b.pk_tab1
MySQL JOIN
对于不支持全连接full join 的数据库,可以使用,
select a.col1,a.col2,b.col3 from tab1 a left [outer] join tab2 b on a.pk_tab1 = b.pk_tab1
union all
select a.col1,a.col2,b.col3 from tab1 a right [outer] join tab2 b on a.pk_tab1 = b.pk_tab1
MySQL 全文索引搜尋 Fulltext Index Search
http://www.sosauce.com/entry/6444/mysql%E5%85%A8%E6%96%87%E7%B4%A2%E5%BC%95%E8%88%87%E6%90%9C%E5%B0%8B/
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
http://onlamp.com/onlamp/2003/06/26/fulltext.html
http://hi.baidu.com/gazi/blog/item/ebbd2e73f29fb2198701b0c5.html
- (玩半天,結果不支援中文!)
- MySQL從3.23.23開始就逐漸支援全文索引和搜尋。
- 全文索引就是建index,全文搜尋就是去查index。
- LIKE是用Regular Expression去做查詢。
- MySQL全文索引是一種index type:FULLTEXT。
- 全文索引的index只能用在MyISAM表格的char、varchar和text的欄位上。
- 全文索引的index可以在create table、alter table和create index時產生。
- create table...
CREATE TABLE article (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body)
) TYPE=MYISAM;
-
- alter table...
- create index...
- 要倒大量的資料到有全文索引index的table速度會很慢,建議先拿掉全文索引index再倒資料,倒完後再加上全文索引index。
- 全文搜尋的語法:
MATCH (col1, col2,...) AGAINST (expr [search_modifier])
- 三種搜尋方式:
- IN BOOLEAN MODE
- IN NATURAL LANGUAGE MODE
- IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION
- IN NATURAL LANGUAGE MODE
- expr就是要搜尋的字串。
- 沒有特殊字元。
- 套用Stopwords。
- 剔
除一半row以上都有的字,譬如說,每個row都有mysql這個字的話,那用mysql去查時,會找不到任何row,這在row的數量無敵多時很有用,
因為把所有row都找出來是沒有意義的,這時,mysql幾乎被當作是stopword;但是當row只有兩筆時,是啥鬼也查不出來的,因為每個字都出現
50%以上,要避免這種狀況,請用IN BOOLEAN MODE。 - 預設的搜尋方式。
SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);
-
- 預設搜尋是不分大小寫,若要分大小寫,columne的character set要從utf8改成utf8_bin。
- 預設MATCH...AGAINST是以相關性排序,由高到低。
- MATCH...AGAINST可以跟所有MySQL語法搭配使用,像是JOIN或是加上其他過濾條件。
-- 第一種count
SELECT COUNT(*)
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);-- 第二種count
SELECT COUNT(IF(MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count
FROM article
-
- 當符合的筆數較多時,第一種count比較慢,因為MATCH...AGAINST會先依相關性排序。
- 當符合的筆數較少時,第二種count比較慢,因為第二種count會掃過所有資料。
- MATCH(title,
body)裡的欄位必須和FULLTEXT(title,
body)裡的欄位一模一樣,如果只要單查title或body一個欄位,那得另外再建一個FULLTEXT(title)或
FULLTEXT(body),也因為如此,MATCH()的欄位一定不能跨table,但是另外兩種搜尋方式好像可以。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article;
-
- 這樣可以取得相關值,而且也因為沒有WHERE和ORDER BY,所以不會排序。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);
-
- 排序又取得相關性,雖然MATCH...AGAINST用了兩次,但是MySQL知道這兩個MATCH...AGAINST是一樣的,所以只會用一次。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
ORDER BY score desc;
-
- 為啥不這樣用就好?
- MySQL的FULLTEXT怎麼斷字:
- 字母、數字、底線的組合視為一個字,不會把底線斷字。
- 會被斷字的字元:空白、逗號(,)與點(.),但不用這些斷字的語言,如中文,就得自行手動斷字。
- 可以自行實做一個斷字的外掛來取代內建的斷字parser。
- 接受一個單引號,如aaa'bbb視為一個字,但是aaa''bbb就是兩個字。
- 字首或字尾的單引號會被去掉,如'aaa或aaa'。
- 全文搜尋時,stopword與少於四個字元的字串會被忽略。
- 可以覆寫內建的stopword清單。
- 可以修改最少四個字元的設定。
- IN BOOLEAN MODE
- expr裡有特殊字元輔助特殊的搜尋語法。
SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('+mysql -yoursql' IN BOOLEAN MODE);
-
- 一定要有msysql,且不要有yoursql。
- IN BOOLEAN MODE的特色:
- 不剔除50%以上符合的row。
- 不自動以相關性反向排序。
- 可以對沒有FULLTEXT index的欄位進行搜尋,但會非常慢。
- 限制最長與最短的字串。
- 套用Stopwords。
- 搜尋語法:
- +:一定要有。
- -:不可以有,但這個「不可以有」指的是在符合的row裡不可以有指定的字串,所以不能只下「-yoursql」這樣是查不到任何row的,必須搭配其他語法使用。
- :(什麼都沒)預設用法,表示可有可無,有的話排比較前面,沒有的排後面。
- >:提高該字的相關性。
- <:降低相關性。
- ( ):條件可以巢狀。
+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然後aaa&bbb排在aaa&ccc前面
-
-
- ~:將其相關性由正轉負,表示擁有該字會降低相關性,但不像「-」將之排除,只是排在較後面。
- *:萬用字,不像其他語法放在前面,這個要接在字串後面。
- " ":用雙引號將一段句子包起來表示要完全相符,不可拆字。
-
- IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
- 也可以用WITH QUERY EXPANSION。
- IN NATURAL LANGUAGE MODE的衍生版。
- 先用IN NATURAL LANGUAGE MODE做搜尋,得到最相關的欄位的字再加到原expr裡,再查一次。
- 神奇功能之一:可以用database查出mysql或oracle,第一次查詢用databae得到一些結果,從這些結果裡抽取字串,此時得到mysql與oracle的機率相當高,最後用database和這些出取出來的字串做一次查詢。
- 神奇功能之二:無法拼出正確字串時,第一次用「相似」的錯誤字串查詢,很有可以得到正確的字串,再用正確的字串急可以得到想要的結果。
- 因為這種查詢方式會讓「雜訊」爆增,所以建議第一次的查詢字串盡量精簡。
- Stopwords請參考http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html。
- 全文搜尋的限制:
- 只能用在MyISAM表格上。
- 支援UTF-8。
- 中文支援問題:
- MySQL不會斷中文字:MySQL內建的字依據是空白、逗號和點,對此內建機制的白痴解法是,存中文字時自行塞入空白斷字,但是還是有下面的限制。
- 查詢字串最少四個字元的限制:所以一二三個中文字都不能查,必須將ft_min_word_len從預設的4改成1。
- 雖然同一個表格可以有不同字元集的欄位,但是同一個FULLTEXT index裡的欄位必須是同一個字元集與collation。
- MATCH裡的欄位必須和FULLTEXT裡的一模一樣,IN BOOLEAN MODE允許不一樣,甚至使用未FULLTEXT index的欄位,但速度很慢。
- AGAINST裡必須是字串,不可以是變數或欄位名稱。
- 全文搜尋使index hint受限。
- MySQL全文搜尋設定:
- 大部分的參數都是啟動參數,也就是修改後必須重新啟動MySQL。
- 有些參數修改必須重新產生索引檔。
mysql> SHOW VARIABLES LIKE 'ft%';
ft_boolean_syntax + -><()~*:""&|
ft_min_word_len 4
ft_max_word_len 84
ft_query_expansion_limit 20 ft_stopword_file (built-in)
-
- ft_min_word_len:最短的索引字串,預設值為4,修改後必須重建索引檔。
- ft_max_word_len:最長的索引字串,預設值因版本而不同,餘同上一點。
[mysqld]
ft_min_word_len=1
-
- ft_stopword_file:stopword檔案路徑,若留空白不設定表示要停用stopword過濾,修改後必須重新啟動MySQL和重建索引;stopword檔案內容可以用分行空白與逗號區隔stopword,但底線和單引號視為合法的字串字元。
- 50%
的門檻限制:設定檔在storage/myisam/ftdefs.h,將 #define GWS_IN_USE GWS_PROB 改為
#define GWS_IN_USE GWS_FREQ,然後重新編譯MySQL,因為近低門檻會影響資料的精準度,所以不建議如此,可用IN
BOOLEAN MODE即可以避開50%的限制。 - ft_boolean_syntax:改變IN BOOLEAN MODE的查詢字元,不用重新啟動MySQL也不用重建索引。
- 修改字串字元的認定,譬如說將「-」認定為字串的合法字元:
- 方法一:修改storage/myisam/ftdefs.h的true_word_char()與misc_word_char(),然後重新編譯MySQL,最後重建索引。
- 方法二:修改字元集檔,然後在FULLTEXT index的欄位使用該字元集,最後重建索引。
- 重建索引:
- 每個有FULLTEXT index的表格都要這麼做。
-
-
- 要注意如果用過myisamchk,會導致上述的設定值回覆成預設值,因為myisamchk不是用MySQL的設定值。
- 解法一:將修改過得設定值加到myisamchk的參數裡。
-
-
-
- 解法二:兩邊都要設定。
-
ft_min_word_len=1
[myisamchk]
ft_min_word_len=1
-
-
- 解法三:用REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE與ALTER TABLE取代myisamchk語法,因為這些語法是由MySQL執行的。
-
MySQL 全文索引搜尋 Fulltext Index Search
http://www.sosauce.com/entry/6444/mysql%E5%85%A8%E6%96%87%E7%B4%A2%E5%BC%95%E8%88%87%E6%90%9C%E5%B0%8B/
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
http://onlamp.com/onlamp/2003/06/26/fulltext.html
http://hi.baidu.com/gazi/blog/item/ebbd2e73f29fb2198701b0c5.html
- (玩半天,結果不支援中文!)
- MySQL從3.23.23開始就逐漸支援全文索引和搜尋。
- 全文索引就是建index,全文搜尋就是去查index。
- LIKE是用Regular Expression去做查詢。
- MySQL全文索引是一種index type:FULLTEXT。
- 全文索引的index只能用在MyISAM表格的char、varchar和text的欄位上。
- 全文索引的index可以在create table、alter table和create index時產生。
- create table...
CREATE TABLE article (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body)
) TYPE=MYISAM;
-
- alter table...
- create index...
- 要倒大量的資料到有全文索引index的table速度會很慢,建議先拿掉全文索引index再倒資料,倒完後再加上全文索引index。
- 全文搜尋的語法:
MATCH (col1, col2,...) AGAINST (expr [search_modifier])
- 三種搜尋方式:
- IN BOOLEAN MODE
- IN NATURAL LANGUAGE MODE
- IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION
- IN NATURAL LANGUAGE MODE
- expr就是要搜尋的字串。
- 沒有特殊字元。
- 套用Stopwords。
- 剔
除一半row以上都有的字,譬如說,每個row都有mysql這個字的話,那用mysql去查時,會找不到任何row,這在row的數量無敵多時很有用,
因為把所有row都找出來是沒有意義的,這時,mysql幾乎被當作是stopword;但是當row只有兩筆時,是啥鬼也查不出來的,因為每個字都出現
50%以上,要避免這種狀況,請用IN BOOLEAN MODE。 - 預設的搜尋方式。
SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);
-
- 預設搜尋是不分大小寫,若要分大小寫,columne的character set要從utf8改成utf8_bin。
- 預設MATCH...AGAINST是以相關性排序,由高到低。
- MATCH...AGAINST可以跟所有MySQL語法搭配使用,像是JOIN或是加上其他過濾條件。
-- 第一種count
SELECT COUNT(*)
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);-- 第二種count
SELECT COUNT(IF(MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count
FROM article
-
- 當符合的筆數較多時,第一種count比較慢,因為MATCH...AGAINST會先依相關性排序。
- 當符合的筆數較少時,第二種count比較慢,因為第二種count會掃過所有資料。
- MATCH(title,
body)裡的欄位必須和FULLTEXT(title,
body)裡的欄位一模一樣,如果只要單查title或body一個欄位,那得另外再建一個FULLTEXT(title)或
FULLTEXT(body),也因為如此,MATCH()的欄位一定不能跨table,但是另外兩種搜尋方式好像可以。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article;
-
- 這樣可以取得相關值,而且也因為沒有WHERE和ORDER BY,所以不會排序。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);
-
- 排序又取得相關性,雖然MATCH...AGAINST用了兩次,但是MySQL知道這兩個MATCH...AGAINST是一樣的,所以只會用一次。
SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
ORDER BY score desc;
-
- 為啥不這樣用就好?
- MySQL的FULLTEXT怎麼斷字:
- 字母、數字、底線的組合視為一個字,不會把底線斷字。
- 會被斷字的字元:空白、逗號(,)與點(.),但不用這些斷字的語言,如中文,就得自行手動斷字。
- 可以自行實做一個斷字的外掛來取代內建的斷字parser。
- 接受一個單引號,如aaa'bbb視為一個字,但是aaa''bbb就是兩個字。
- 字首或字尾的單引號會被去掉,如'aaa或aaa'。
- 全文搜尋時,stopword與少於四個字元的字串會被忽略。
- 可以覆寫內建的stopword清單。
- 可以修改最少四個字元的設定。
- IN BOOLEAN MODE
- expr裡有特殊字元輔助特殊的搜尋語法。
SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('+mysql -yoursql' IN BOOLEAN MODE);
-
- 一定要有msysql,且不要有yoursql。
- IN BOOLEAN MODE的特色:
- 不剔除50%以上符合的row。
- 不自動以相關性反向排序。
- 可以對沒有FULLTEXT index的欄位進行搜尋,但會非常慢。
- 限制最長與最短的字串。
- 套用Stopwords。
- 搜尋語法:
- +:一定要有。
- -:不可以有,但這個「不可以有」指的是在符合的row裡不可以有指定的字串,所以不能只下「-yoursql」這樣是查不到任何row的,必須搭配其他語法使用。
- :(什麼都沒)預設用法,表示可有可無,有的話排比較前面,沒有的排後面。
- >:提高該字的相關性。
- <:降低相關性。
- ( ):條件可以巢狀。
+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然後aaa&bbb排在aaa&ccc前面
-
-
- ~:將其相關性由正轉負,表示擁有該字會降低相關性,但不像「-」將之排除,只是排在較後面。
- *:萬用字,不像其他語法放在前面,這個要接在字串後面。
- " ":用雙引號將一段句子包起來表示要完全相符,不可拆字。
-
- IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
- 也可以用WITH QUERY EXPANSION。
- IN NATURAL LANGUAGE MODE的衍生版。
- 先用IN NATURAL LANGUAGE MODE做搜尋,得到最相關的欄位的字再加到原expr裡,再查一次。
- 神奇功能之一:可以用database查出mysql或oracle,第一次查詢用databae得到一些結果,從這些結果裡抽取字串,此時得到mysql與oracle的機率相當高,最後用database和這些出取出來的字串做一次查詢。
- 神奇功能之二:無法拼出正確字串時,第一次用「相似」的錯誤字串查詢,很有可以得到正確的字串,再用正確的字串急可以得到想要的結果。
- 因為這種查詢方式會讓「雜訊」爆增,所以建議第一次的查詢字串盡量精簡。
- Stopwords請參考http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html。
- 全文搜尋的限制:
- 只能用在MyISAM表格上。
- 支援UTF-8。
- 中文支援問題:
- MySQL不會斷中文字:MySQL內建的字依據是空白、逗號和點,對此內建機制的白痴解法是,存中文字時自行塞入空白斷字,但是還是有下面的限制。
- 查詢字串最少四個字元的限制:所以一二三個中文字都不能查,必須將ft_min_word_len從預設的4改成1。
- 雖然同一個表格可以有不同字元集的欄位,但是同一個FULLTEXT index裡的欄位必須是同一個字元集與collation。
- MATCH裡的欄位必須和FULLTEXT裡的一模一樣,IN BOOLEAN MODE允許不一樣,甚至使用未FULLTEXT index的欄位,但速度很慢。
- AGAINST裡必須是字串,不可以是變數或欄位名稱。
- 全文搜尋使index hint受限。
- MySQL全文搜尋設定:
- 大部分的參數都是啟動參數,也就是修改後必須重新啟動MySQL。
- 有些參數修改必須重新產生索引檔。
mysql> SHOW VARIABLES LIKE 'ft%';
ft_boolean_syntax + -><()~*:""&|
ft_min_word_len 4
ft_max_word_len 84
ft_query_expansion_limit 20 ft_stopword_file (built-in)
-
- ft_min_word_len:最短的索引字串,預設值為4,修改後必須重建索引檔。
- ft_max_word_len:最長的索引字串,預設值因版本而不同,餘同上一點。
[mysqld]
ft_min_word_len=1
-
- ft_stopword_file:stopword檔案路徑,若留空白不設定表示要停用stopword過濾,修改後必須重新啟動MySQL和重建索引;stopword檔案內容可以用分行空白與逗號區隔stopword,但底線和單引號視為合法的字串字元。
- 50%
的門檻限制:設定檔在storage/myisam/ftdefs.h,將 #define GWS_IN_USE GWS_PROB 改為
#define GWS_IN_USE GWS_FREQ,然後重新編譯MySQL,因為近低門檻會影響資料的精準度,所以不建議如此,可用IN
BOOLEAN MODE即可以避開50%的限制。 - ft_boolean_syntax:改變IN BOOLEAN MODE的查詢字元,不用重新啟動MySQL也不用重建索引。
- 修改字串字元的認定,譬如說將「-」認定為字串的合法字元:
- 方法一:修改storage/myisam/ftdefs.h的true_word_char()與misc_word_char(),然後重新編譯MySQL,最後重建索引。
- 方法二:修改字元集檔,然後在FULLTEXT index的欄位使用該字元集,最後重建索引。
- 重建索引:
- 每個有FULLTEXT index的表格都要這麼做。
-
-
- 要注意如果用過myisamchk,會導致上述的設定值回覆成預設值,因為myisamchk不是用MySQL的設定值。
- 解法一:將修改過得設定值加到myisamchk的參數裡。
-
-
-
- 解法二:兩邊都要設定。
-
ft_min_word_len=1
[myisamchk]
ft_min_word_len=1
-
-
- 解法三:用REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE與ALTER TABLE取代myisamchk語法,因為這些語法是由MySQL執行的。
-
2010年11月10日 星期三
2010年11月7日 星期日
2010年7月4日 星期日
jquery easy dialog 衝突
jquery easy dialog: http://projectshadowlight.org/jquery-easy-confirm-dialog/
jquery tools:http://flowplayer.org/tools/demos/index.html
兩者不能共存,easy dialog會被tools衝到。
不過tools 的overlay其實就有dialog的功能。
jquery easy dialog 衝突
jquery easy dialog: http://projectshadowlight.org/jquery-easy-confirm-dialog/
jquery tools:http://flowplayer.org/tools/demos/index.html
兩者不能共存,easy dialog會被tools衝到。
不過tools 的overlay其實就有dialog的功能。
2010年7月2日 星期五
Codeigniter set_value() bug
Codeigniter在用set_value還原上一次input的資料時,如果Controller有把form_validation
讀進來,set_value就會透過form_validion這個library來指派資料的。
如果沒有在Controller裡面執行$this->form_validtion->run()的話,set_value就會變得一點用都沒有。
當然,如果沒有把form_validation讀進來的話,就沒有這個問題了。
資料來源:http://codeigniter.com/forums/viewthread/157530/
Codeigniter set_value() bug
Codeigniter在用set_value還原上一次input的資料時,如果Controller有把form_validation
讀進來,set_value就會透過form_validion這個library來指派資料的。
如果沒有在Controller裡面執行$this->form_validtion->run()的話,set_value就會變得一點用都沒有。
當然,如果沒有把form_validation讀進來的話,就沒有這個問題了。
資料來源:http://codeigniter.com/forums/viewthread/157530/
2010年6月24日 星期四
Netbeans Tips
Ctrl + Shift + C: Comments out the
selected block of code.
Ctrl + Shift + (UP/DOWN ) duplicate line up/down
Ctrl + E deletes the current line (very useful)
- Ctrl + Shift + I: Fixes your
imports, handy if you've just written a piece of code that needs a lot
of packages imported.
- alt+ shift + o --> allows you to search and
open any file in your open projects
Netbeans Tips
Ctrl + Shift + C: Comments out the
selected block of code.
Ctrl + Shift + (UP/DOWN ) duplicate line up/down
Ctrl + E deletes the current line (very useful)
- Ctrl + Shift + I: Fixes your
imports, handy if you've just written a piece of code that needs a lot
of packages imported.
- alt+ shift + o --> allows you to search and
open any file in your open projects
2010年6月18日 星期五
GIF Creator Notes
Transparent Color:將會透明的顏色
四種Disposal method 方式分別是:
0 - 不使用處置方法
1 - 不處置圖形,把圖形從當前位置移去
2 - 回覆到背景色
3 - 回覆到先前狀態
GIF Creator Notes
Transparent Color:將會透明的顏色
四種Disposal method 方式分別是:
0 - 不使用處置方法
1 - 不處置圖形,把圖形從當前位置移去
2 - 回覆到背景色
3 - 回覆到先前狀態
2010年6月3日 星期四
PHP array_splice
<h1>array_splice(Array, int offset, int length, mixed replacement)</h1>
刪除Array中從offset開始length個元素,並用replacement取代。
<ol>
<li>offset < 0:從尾端第abs(offset)個元素<b>開始(包括)</b></li>
<li>length < 0:刪除(取代)<b>直到(不包括)</b>尾端第abs(offset)個元素</li>
</ol>
<a href="http://www.php.net/manual/en/function.array-splice.php">Reference</a>
PHP array_splice
<h1>array_splice(Array, int offset, int length, mixed replacement)</h1>
刪除Array中從offset開始length個元素,並用replacement取代。
<ol>
<li>offset < 0:從尾端第abs(offset)個元素<b>開始(包括)</b></li>
<li>length < 0:刪除(取代)<b>直到(不包括)</b>尾端第abs(offset)個元素</li>
</ol>
<a href="http://www.php.net/manual/en/function.array-splice.php">Reference</a>
2010年4月27日 星期二
MySQL 字串類型
http://twpug.net/docs/mysql-5.1/column-types.html#blob
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
定
義。
MySQL 字串類型
http://twpug.net/docs/mysql-5.1/column-types.html#blob
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
定
義。
MySQL 字串類型
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
定
義。
MySQL 字串類型
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
定
義。