set是乙個字串物件,可以有零或多個值,其值來自表建立時規定的允許的一列值。指定包括多個set成員的set列值時各成員之間用逗號(『,』)間隔開。這樣set成員值本身不能包含逗號。
例如,指定為set('one', 'two') not null的列可以有下面的任何值:
'one'
'two'
'one,two'
set最多可以有64個不同的成員。
當建立表時,set成員值的尾部空格將自動被刪除。
當檢索時,儲存在set列的值使用列定義中所使用的大小寫來顯示。請注意可以為set列分配字符集和校對規則。對於二進位制或大小寫敏感的校對規則,當為列分配值時應考慮大小寫。
mysql用數字儲存set值,所儲存值的低階位對應第1個set成員。如果在數值上下文中檢索乙個set值,檢索的值的位設定對應組成列值的set成員。例如,你可以這樣從乙個set列檢索數值值:
mysql> select set_col+0 from tbl_name;
如果將乙個數字儲存到set列中,數字中二進位制表示中的位確定了列值中的set成員。對於指定為set('a','b','c','d')的列,成員有下面的十進位制和二進位制值:
set成員
十進位制值
二進位制值
'a''b'
'c''d'
如果你為該列分配乙個值9,其二進位制形式為1001,因此第1個和第4個set值成員'a'和'd'被選擇,結果值為 'a,d'。
對於包含多個set元素的值,當插入值時元素所列的順序並不重要。在值中乙個給定的元素列了多少次也不重要。當以後檢索該值時,值中的每個元素出現一次,根據表建立時指定的順序列出元素。例如,假定某個列指定為set('a','b','c','d'):
mysql> create table myset (col set('a', 'b', 'c', 'd'));
插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d':
mysql> insert into myset (col) values
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
query ok, 5 rows affected (0.01 sec)
records: 5 duplicates: 0 warnings: 0
當檢索時所有這些值顯示為 'a,d':
mysql> select col from myset;
| col |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
5 rows in set (0.04 sec)
如果將set列設定為乙個不支援的值,則該值被忽略並發出警告:
mysql> insert into myset (col) values ('a,d,d,s');
query ok, 1 row affected, 1 warning (0.03 sec)
mysql> show warnings;
| level | code | message |
| warning | 1265 | data truncated for column 'col' at row 1 |
1 row in set (0.04 sec)
mysql> select col from myset;
| col |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
6 rows in set (0.01 sec)
set值按數字順序排序。null值排在非null set值的前面。
通常情況,可以使用find_in_set()函式或like操作符搜尋set值:
mysql> select * from tbl_name where find_in_set('value',set_col)>0;
mysql> select * from tbl_name where set_col like '%value%';
第1個語句找出set_col包含value set成員的行。第2個類似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另乙個set成員的子字串中。
下面的語句也是合法的:
mysql> select * from tbl_name where set_col & 1;
mysql> select * from tbl_name where set_col = 'val1,val2';
第1個語句尋找包含第1個set成員的值。第2個語句尋找乙個確切匹配的值。應注意第2類的比較。將set值與'val1,val2'比較返回的結果與同'val2,val1'比較返回的結果不同。指定值時的順序應與在列定義中所列的順序相同。
如果想要為set列確定所有可能的值,使用show columns from tbl_name like set_col並解析輸出中第2列的set定義。
剛才研究mysql文件,發現set型別的真正含義:
實際上,set可以包含最多64個成員,其值為乙個整數。這個整數
的二進位製碼表示該set的值的哪些成員為真。例如有set('a','b','c','d'),
那麼當它們的值為:
set member decimal value binary value
a 1 0001
b 2 0010
c 4 0100
d 8 1000
如果你將9存入某個set域,那麼其二進位制值為1001,也就是說這
個值中'a'和'd'為真。
可以想到,如果這樣的話,大家可以用like命令和find_in_set()
函式來檢索set值:
mysql> select * from tbl_name where set_col like '%value%';
mysql> select * from tbl_name where find_in_set('value',set_col)>0;
當然,以下sql語句也是合法的,他們顯得更加簡潔:
mysql> select * from tbl_name where set_col = 'val1,val2';
mysql> select * from tbl_name where set_col & 1;
哈哈,這麼一來,大家下次控制許可權的時候就不用設乙個int型,然後
在那裡與呀或的,還要另外定義許可權的名稱,用set型字段輕鬆搞定!!
mysql set標籤 標籤
標籤 標籤用來配置資料來源或者將資料來源資訊儲存在某作用域的變數中,用來作為其它jstl資料庫操作的資料來源。語法格式 var scope datasource driver url user password 屬性標籤有如下屬性 屬性描述 是否必要 預設值driver 要註冊的jdbc驅動否無 u...
mysql SET型別 應用技巧
mysql set型別,官方手冊 應用例項如下 有 一張表pms serverlist,現讓該錶的某條記錄的state欄位設定為 merged 和 hidden 操作如下 update pms serverlist set state state 4 16where serverid 47 現讓該錶...
mysql 字段 MySQL欄位型別詳解
mysql支援大量的列型別,它可以被分為3類 數字型別 日期和時間型別以及字串 字元 型別。本節首先給出可用型別的乙個概述,並且總結每個列型別的儲存需求,然後提供每個類中的型別性質的更詳細的描述。概述有意簡化,更詳細的說明應該考慮到有關特定列型別的附加資訊,例如你能為其指定值的允許格式。由mysql...