<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/mysql-datatype-set-and-enum-html/</link>
<title><![CDATA[mysql的set类型和enum类型]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[数据库]]></category>
<pubDate>Mon, 24 Oct 2016 09:19:30 +0000</pubDate> 
<guid>https://www.heckjj.com/mysql-datatype-set-and-enum-html/</guid> 
<description>
<![CDATA[ 
	SET类型<br/>SET是一个字符串对象，可以有零或多个值，其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。所以SET成员值本身不能包含逗号。<br/><br/>例如，指定为SET('one', 'two') NOT NULL的列可以有下面的任何值：<br/><br/>'' <br/>'one' <br/>'two' <br/>'one,two' <br/>SET最多可以有64个不同的成员。<br/><br/>当创建表时，SET成员值的尾部空格将自动被删除。<br/><br/>当检索时，保存在SET列的值使用列定义中所使用的大小写来显示。请注意可以为SET列分配字符集和校对规则。对于二进制或大小写敏感的校对规则，当为列分配值时应考虑大小写。<br/><br/>MySQL用数字保存SET值，所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值，检索值的位置对应组成列值的SET成员。例如，你可以这样从一个SET列检索数值值：<br/><br/>mysql> SELECT col+0 FROM myset; <br/>如果将一个数字保存到SET列中，数字中二进制表示中的位确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列，成员有下面的十进制和二进制值：<br/><br/>SET成员<br/><br/>十进制值<br/><br/>二进制值<br/><br/>'a'<br/><br/>1<br/><br/>0001<br/><br/>'b'<br/><br/>2<br/><br/>0010<br/><br/>'c'<br/><br/>4<br/><br/>0100<br/><br/>'d'<br/><br/>8<br/><br/>1000<br/><br/> <br/><br/>如果你为该列分配一个值9，其二进制形式为1001，因此第1个和第4个SET值成员'a'和'd'被选择，结果值为 'a,d'。<br/><br/>对于包含多个SET元素的值，当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时，值中的每个元素出现一次，根据表创建时指定的顺序列出元素。例如，假定某个列指定为SET('a','b','c','d')：<br/><br/>mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); <br/>插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d':<br/><br/>mysql> INSERT INTO myset (col) VALUES&nbsp;&nbsp;<br/>-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); <br/>Query OK, 5 rows affected (0.01 sec) <br/>Records: 5&nbsp;&nbsp;Duplicates: 0&nbsp;&nbsp;Warnings: 0 <br/>当检索时所有这些值显示为 'a,d'：<br/><br/>mysql> SELECT col FROM myset; <br/>+------+ <br/>&#124; col&nbsp;&nbsp;&#124; <br/>+------+ <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>+------+ <br/>5 rows in set (0.04 sec) <br/>如果将SET列设置为一个不支持的值，则该值被忽略并发出警告：<br/><br/>mysql> INSERT INTO myset (col) VALUES ('a,d,d,s'); <br/>Query OK, 1 row affected, 1 warning (0.03 sec) <br/>&nbsp;&nbsp;<br/>mysql> SHOW WARNINGS; <br/>+---------+------+------------------------------------------+ <br/>&#124; Level&nbsp;&nbsp; &#124; Code &#124; Message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; <br/>+---------+------+------------------------------------------+ <br/>&#124; Warning &#124; 1265 &#124; Data truncated for column 'col' at row 1 &#124; <br/>+---------+------+------------------------------------------+ <br/>1 row in set (0.04 sec) <br/>&nbsp;&nbsp;<br/>mysql> SELECT col FROM myset; <br/>+------+ <br/>&#124; col&nbsp;&nbsp;&#124; <br/>+------+ <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>&#124; a,d&nbsp;&nbsp;&#124; <br/>+------+ <br/>6 rows in set (0.01 sec) <br/>SET值按数字顺序排序。NULL值排在非NULL SET值的前面。<br/><br/>通常情况，可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值：<br/><br/>mysql> SELECT * FROM myset WHERE FIND_IN_SET('value',col)>0; <br/>mysql> SELECT * FROM myset WHERE col LIKE '%value%'; <br/>第1个语句找出col包含value set成员的行。第2个类似，但有所不同：它在其它地方找出col包含value的行，甚至是在另一个SET成员的子字符串中。<br/><br/>下面的语句也是合法的：<br/><br/>mysql> SELECT * FROM myset WHERE col & 1; <br/>mysql> SELECT * FROM myset WHERE col = 'val1,val2'; <br/>第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。<br/><br/>如果想要为SET列确定所有可能的值，使用SHOW COLUMNS FROM myset LIKE col并解析输出中第2列的SET定义。<br/><br/> <br/><br/>ENUM类型<br/><br/>ENUM是一个字符串对象，其值来自表创建时在列规定中显式枚举的一列值。<br/><br/>在某些情况下，ENUM值也可以为空字符串('')或NULL：<br/><br/>· 如果你将一个非法值插入ENUM(也就是说，允许的值列之外的字符串)，将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同，该字符串有数值值0。<br/><br/>· 如果将ENUM列声明为允许NULL，NULL值则为该列的一个有效值，并且默认值为NULL。如果ENUM列被声明为NOT NULL，其默认值为允许的值列的第1个元素。<br/><br/>每个枚举值有一个索引：<br/><br/>· 来自列规定的允许的值列中的值从1开始编号。<br/><br/>· 空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行：<br/><br/>· mysql> SELECT * FROM tbl_name WHERE enum_col=0; <br/>· NULL值的索引是NULL。<br/><br/>例如，定义为ENUM的列('one'，'two'，'three')可以有下面所示任何值。还显示了每个值的索引：<br/><br/>值<br/><br/>索引<br/><br/>NULL<br/><br/>NULL<br/><br/>''<br/><br/>0<br/><br/>'one'<br/><br/>1<br/><br/>'two'<br/><br/>2<br/><br/>'three'<br/><br/>3<br/><br/>枚举最多可以有65,535个元素。<br/><br/>当创建表时，ENUM成员值的尾部空格将自动被删除。<br/><br/>当检索时，保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和校对规则。对于二进制或大小写敏感的校对规则，当为列分配值时应考虑大小写。<br/><br/>如果在数值上下文中检索一个ENUM值，将返回列值的索引。例如，你可以这样从ENUM列搜索数值值：<br/><br/>mysql> SELECT enum_col+0 FROM tbl_name; <br/>如果将一个数字保存到ENUM列，数字被视为索引，并且保存的值是该索引对应的枚举成员。(但是，这不适合LOAD DATA，它将所有输入视为字符串）。不建议使用类似数字的枚举值来定义一个ENUM列，因为这很容易引起混淆。例如，下面的列含有字符串值'0'、'1'和'2'的枚举成员，但数值索引值为1、2和3：<br/><br/>numbers ENUM('0','1','2') <br/>根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说，ENUM值根据索引编号进行排序）。例如，对于ENUM('a'，'b')，'a'排在'b'前面，但对于ENUM('b'，'a')，'b'排在'a'前面。空字符串排在非空字符串前面，并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果，按字母顺序规定ENUM列。还可以使用GROUP BY&nbsp;&nbsp;CAST(col AS CHAR)或GROUP BY&nbsp;&nbsp;CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。<br/><br/>如果你想要确定一个ENUM列的所有可能的值，使用SHOW COLUMNS FROM tbl_name LIKE enum_col，并解析输出中第2列的ENUM定义。<br/>Tags - <a href="https://www.heckjj.com/tags/mysql%25E7%259A%2584set%25E7%25B1%25BB%25E5%259E%258B%25E5%2592%258Cenum%25E7%25B1%25BB%25E5%259E%258B/" rel="tag">mysql的set类型和enum类型</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/mysql-datatype-set-and-enum-html/#blogcomment</link>
<title><![CDATA[[评论] mysql的set类型和enum类型]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/mysql-datatype-set-and-enum-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>