我应该在mysql中使用哪种数据类型作为可选字符串?

时间:2017-08-16 06:20:15

标签: mysql text varchar

我想确定当我想存储一个可选的字符串时,我应该使用哪种mysql变量类型,而且大部分它都是null。 我想在这里使用 BLOB TEXT 之类的变量而不是varchar是我的支持理由:

  1. 我希望可选字符串的长度超过64 kb。我不希望数据截断。
  2. TEXT变量在正常情况下没有数据填充,这对于短测试来说非常紧凑。
  3. 知道这些类型的数据是在表区域之外的区域中分配的,并且在检索时有开销,我准备接受这个小开销;因为我不太经常使用它。
  4. 示例是:

          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。 提前谢谢。

2 个答案:

答案 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不是一种常量,VARCHARVARCHAR(MAX)是非常不同的类型,后者非常接近TEXT

SQL Server 的早期版本中,您无法直接访问TEXT,您只能获得TEXTPTR并在READTEXT和{{{{}}中使用它1}}函数。

SQL Server 2005 中,您可以直接访问WRITETEXT列(但仍需要明确转换为TEXT以为其分配值)。

VARCHAR很好:

  • 如果您需要在数据库中存储大型文本
  • 如果您不搜索列的值
  • 如果您很少选择此列,请不要加入此列。

TEXT很好:

  • 如果你存储小字符串
  • 如果搜索字符串值
  • 如果您总是选择它或在连接中使用它。

通过选择,我的意思是发出任何返回列值的查询。

通过搜索,我的意思是发出任何查询,其结果取决于VARCHARTEXT列的值。这包括在任何VARCHARJOIN条件下使用它。

由于WHERE存储在行外,因此不涉及TEXT列的查询通常会更快。

TEXT有用的一些例子:

  • 博客评论
  • 维基页面
  • 代码来源

TEXT有用的一些例子:

  • 用户名
  • 页面标题
  • 文件名

根据经验,如果您需要文本值超过 200 字符 AND ,请勿在此列上使用联接,请使用VARCHAR

否则请使用TEXT

P.S。同样适用于VARCHAR已启用UNICODENTEXT,您应该将其用于上述示例。

PPS 这同样适用于 SQL Server 2005 + 使用的NVARCHARVARCHAR(MAX),而不是NVARCHAR(MAX)和{{1} }}。如果您希望将TEXT永久存储在行之外,则需要为NTEXT启用large value types out of row

如上所述heresp_tableoption将在以后的版本中弃用:

  

SQL Server 的未来版本中将删除TEXT选项。避免在新的开发工作中使用此选项,并计划修改当前使用text in row的应用程序。我们建议您使用text in rowvarchar(max)nvarchar(max)数据类型存储大数据。要控制这些数据类型的行内和行外行为,请使用varbinary(max)选项。

SQL Server Text type vs. varchar data type

复制