mysql保存字符串⽤什么数据类型_MySQL数据类型-字符串数
据类型(3)
1.ENUM类型
ENUM是⼀个字符串对象,其值从允许值列表中选择,创建表时,这些允许的值在列定义中明确列出。
ENUM类型具有以下优点:
●在列具有有限可能值的情况下压缩数据存储。指定为输⼊值的字符串将⾃动编码为数字。
●查询和输出可读性强。在查询结果中这些数字被转换回相应的字符串。
需要考虑的潜在问题:
创建和使⽤ENUM列
枚举值必须是带引号的字符串⽂本。例如,可以创建⼀个具有ENUM列的表:
将100万⾏值为'medium'的记录插⼊此表将需要100万字节的存储空间,⽽如果将实际字符串'medium'存储在VARCHAR列中,则需要600万字节的存储空间。
枚举⽂本的索引值
每个枚举值都有⼀个索引:
●列定义中的枚举元素被分配了索引号,从1开始。
●空字符串('')错误值的索引值为0。这意味着您可以使⽤以下SELECT语句查分配了⽆效ENUM值的⾏:
●NULL值的索引为NULL。
●这⾥的术语"index"是指枚举值列表中的⼀个位置。它与表索引⽆关。
例如,定义为ENUM('Mercury', 'Venus', 'Earth')的列可以具有此处显⽰的任何值。还显⽰了每个值的索引。
值
索引
NULLmysql创建表数据类型
NULL
''
'Mercury'
1
'Venus'
2
'Earth'
3
ENUM列最多可以有65535个不同元素。
如果在数值上下⽂中检索ENUM值,则返回列值的索引。例如,可以从ENUM列中检索数值,如下所⽰:
类似SUM()或AVG()这样的函数需要数值参数,在必要时会将参数转换为数字。对于ENUM值,将在计算中使⽤索引号。
枚举字⾯量的处理
创建表时,将⾃动从表定义中的ENUM成员值中删除尾随空格。
检索时,存储在ENUM列中的值将使⽤列定义中使⽤的字母⼤⼩写显⽰。请注意,可以为ENUM列分
配字符集和排序规则。对于⼆进制或区分⼤⼩写的排序规则,将值分配给列时将考虑字母⼤⼩写。
如果将数字存储到ENUM列中,则该数字将被视为可能的索引值,并且存储的值是具有该索引的枚举成员。(但是,这对于LOAD DATA语句不起作⽤,因为此语句将所有输⼊都视为字符串。)如果数值被引号引起来,则如果枚举值列表中没有匹配的字符串,则仍将其解释为索引。由于这些原因,不建议使⽤看起来像数字的ENUM值定义枚举列,因为这很容易使⼈混淆。例如,以下列具有枚举成员"0"、"1"和"2",但数字索引值为1、2和3:
如果存储2,它将被解释为⼀个索引值,并变为"1"(索引值是2)。如果存储'2',则它与枚举值匹配,因此存储为'2'。如果存储'3',则它与任何枚举值都不匹配,因此它被视为索引并变为'2'(索引值是3)。
要确定ENUM列的所有可能值,请使⽤SHOW COLUMNS FROM tbl_name LIKE 'enum_col'并在查询结果的Type列中解析ENUM定义。
空或NULL枚举值
枚举值在某些情况下也可以是空字符串('')或NULL值:
●如果将⽆效值插⼊ENUM(即,允许值列表中不存在的字符串),则会将空字符串作为特殊错误值插⼊。此字符串与"普通"空字符串的区别在于此字符串的数值为0。
如果启⽤了严格SQL模式,则尝试插⼊⽆效的ENUM值将导致错误。
●如果ENUM列声明为允许NULL,则NULL值是该列的有效值,默认值为NULL。如果ENUM列声明为NOT NULL,则其默认值是允许值列表的第⼀个元素。
枚举排序
ENUM值根据其索引号进⾏排序,索引号取决于列定义中列出枚举成员的顺序。例如,对于 ENUM('b', 'a'),'b'排序在'a'之前。空字符串排序在⾮空字符串之前,NULL值排序在所有其他枚举值之前。
为了防⽌在ENUM列上使⽤ORDER BY⼦句时出现意外结果,可以使⽤以下技术之⼀:
●按字母顺序指定枚举列表。
●通过ORDER BY CAST(col AS CHAR) 或者 ORDER BY CONCAT(col)语句确保列是按词汇顺序排序的,⽽不是按索引号排序。
枚举限制
枚举值不能是表达式,甚⾄不能是计算结果为字符串值的表达式。
例如,下⾯的CREATE TABLE语句不起作⽤,因为CONCAT函数不能⽤于构造枚举值:
也不能将⽤户变量⽤作枚举值。下⾯的语句不起作⽤:
强烈建议您不要使⽤数字作为枚举值,因为它不能保存在适当的TINYINT或SMALLINT类型中,⽽且如果不正确地引⽤枚举值,很容易混淆字符串和隐含的数字值(可能不同)。如果使⽤数字作为枚举值,请始终将其括在引号中。如果省略引号,则该数字视为索引。
定义中的重复值会导致警告,如果启⽤了严格SQL模式,则会导致错误。
2.SET类型
SET是⼀个字符串对象,可以有零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。SET列值由多个集合成员组成,它们由逗号(,)分隔。其结果是,成员值本⾝不应包含逗号。
例如,列指定为SET('one', 'two') NOT NULL可以具有以下任何值:
⼀个集合列最多可以有64个不同的成员。
定义中的重复值会引起警告,如果启⽤了严格SQL模式,则会导致错误。
创建表时,将⾃动从表定义中的集合成员值中删除尾随空格。
有关SET类型的存储要求,请参见字符串类型存储要求。
检索时,存储在集合列中的值将使⽤列定义中使⽤的字母⼤⼩写显⽰。请注意,可以为集合列分配字符集和排序规则。对于⼆进制或区分⼤⼩写的排序规则,将值分配给列时将考虑字母⼤⼩写。
MySQL以数字⽅式存储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('a','b','c','d'):
如果分别插⼊值'a,d','d,a','a,d,d','a,d,a'和'd,a,d':
当检索时所有值都显⽰为'a,d':
如果将SET列设置为不⽀持的值,则忽略该值并发出警告:
如果启⽤了严格SQL模式,则尝试插⼊⽆效的SET值将导致错误。
SET值按数字排序。NULL值的排序在⾮NULL集合值之前。
类似SUM()或AVG()等需要数值参数的函数,在必要时将参数转换为数字。对于SET值,将转换成数值使⽤。
通常,使⽤FIND_IN_SET()函数或LIKE运算符搜索SET值:
第⼀条语句查set_col包含集合成员'value'的⾏。第⼆个类似,但不完全⼀样:它查set_col在任何部分包含'value'的⾏,甚⾄是另⼀个集合成员的⼦字符串。
还允许以下语句:
这些语句中的第⼀个语句查包含第⼀个集合成员的值。第⼆个要查⼀个精确匹配值。要当⼼第⼆种类型的⽐较。将集合值
与'val1,val2'进⾏⽐较所返回的结果与将值与'val2,val1'进⾏⽐较所返回的结果不同。应该按照列定义中列出的顺序指定值。
若要确定集合列的所有可能值,请使⽤SHOW COLUMNS FROM tbl_name LIKE set_col 语句并分析输出的Type列中的集合定义。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论