我想确定当我想存储一个可选的字符串时,我应该使用哪种mysql变量类型,而且大部分它都是null。 我想在这里使用 BLOB 或 TEXT 之类的变量而不是varchar是我的支持理由:
示例是:
column_a | column_b| column_c| column_d| optional_column
---------------+---------+---------+---------+-----------------
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |as,fgdfg
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |asd,asda
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |NULL
asdfasdf |asdfasdf |sdfsdfas |dadasd |{"asdasd":"Asdas"....
请根据我的情况建议我。 我正在考虑使用TEXT。 提前谢谢。
答案 0 :(得分:0)
您应该使用TEXT字段,因为文本是您存储在其中的文本。 BLOB字段应该用于存储像图像这样的二进制数据。 如果需要,两种字段类型都是可搜索的。所以它更可能是一个设计决策。我更喜欢使用它应该存储的类型。
答案 1 :(得分:0)
TEXT
用于大量字符串数据。如果字段的长度超过某个阈值,则文本将存储在行外。
VARCHAR
始终存储在行中,并且限制为 8000 个字符。如果您尝试创建VARCHAR(x)
,其中 x> 8000 ,您收到错误:
服务器:消息131,级别15,状态3,行1
'varchar'类型的size()超过了任何数据类型允许的最大值(8000)
这些长度限制与 SQL Server 2005 中的VARCHAR(MAX)
无关,它可能存储在行外,就像TEXT
一样。
请注意,MAX
不是一种常量,VARCHAR
和VARCHAR(MAX)
是非常不同的类型,后者非常接近TEXT
。
在 SQL Server 的早期版本中,您无法直接访问TEXT
,您只能获得TEXTPTR
并在READTEXT
和{{{{}}中使用它1}}函数。
在 SQL Server 2005 中,您可以直接访问WRITETEXT
列(但仍需要明确转换为TEXT
以为其分配值)。
VARCHAR
很好:
TEXT
很好:
通过选择,我的意思是发出任何返回列值的查询。
通过搜索,我的意思是发出任何查询,其结果取决于VARCHAR
或TEXT
列的值。这包括在任何VARCHAR
或JOIN
条件下使用它。
由于WHERE
存储在行外,因此不涉及TEXT
列的查询通常会更快。
TEXT
有用的一些例子:
TEXT
有用的一些例子:
根据经验,如果您需要文本值超过 200 字符 AND ,请勿在此列上使用联接,请使用VARCHAR
。
否则请使用TEXT
。
P.S。同样适用于VARCHAR
已启用UNICODE
和NTEXT
,您应该将其用于上述示例。
PPS 这同样适用于 SQL Server 2005 + 使用的NVARCHAR
和VARCHAR(MAX)
,而不是NVARCHAR(MAX)
和{{1} }}。如果您希望将TEXT
永久存储在行之外,则需要为NTEXT
启用large value types out of row
。
如上所述here,sp_tableoption
将在以后的版本中弃用:
复制SQL Server 的未来版本中将删除
TEXT
选项。避免在新的开发工作中使用此选项,并计划修改当前使用text in row
的应用程序。我们建议您使用text in row
,varchar(max)
或nvarchar(max)
数据类型存储大数据。要控制这些数据类型的行内和行外行为,请使用varbinary(max)
选项。