2017-08-16 277 views
0

我想确定哪个mysql变量类型应该使用,当我想存储一个字符串是可选的,并且大多数情况下它将为空。 我想用BLOBTEXT像变量,而不是为varchar这里是我支持的原因:哪些数据类型应该用于mysql中的可选字符串?

  1. 我想可选的字符串内有64个kb.I多个长度不希望数据截断。
  2. 在正常情况下,TEXT变量没有数据填充,这对于短暂测试来说非常紧凑。
  3. 了解这些类型的数据在表区域外分配并且在检索时有开销,我准备好接受这个小开销;因为我会少用它。

例子是:

 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".... 

根据我的情况,请给我建议。 fyi我正在考虑使用TEXT。 在此先感谢。

+0

复制如果您希望将不同的数据类型存储在它特别JSON我将存储的从另一张桌子的钥匙。在该表格中,我会将每个可接受的类型存储在列中。这导致一些更多的空值,但它也为搜索,过滤等提供了巨大的优势。如果你只是想存储文本,比使用文本不blob。 – Doomenik

回答

0

您应该使用TEXT字段,因为文本就是您存储的内容。应该使用BLOB字段来存储像图像这样的二进制数据。 这两种字段类型都是可搜索的,如果需要的话。所以它更可能是一个设计决定。我更喜欢使用它应该存储的类型。

+0

感谢回应,顺便说一句,我意识到这一点:)。 –

+0

@PreetamKumar如果你知道上述情况,那么你为什么首先提出这个问题? – Shadow

+0

@Shadow我没有提到使用BLOB,我提到过TEXT和BLOB就像数据类型(我明白使用TEXT)。所以我想根据我的情况提出建议。 –

0

TEXT用于大块字符串数据。如果字段的长度超过某个阈值,则文本将存储在行外。

VARCHAR始终存储在行中并且具有限制个字符。如果您尝试创建一个VARCHAR(x),其中X> 8000,你会得到一个错误:

Server: Msg 131, Level 15, State 3, Line 1

The size() given to the type ‘varchar’ exceeds the maximum allowed for any data type (8000)

这些长度限制做不关注VARCHAR(MAX)SQL Server 2005中,可以存储在行外,只像TEXT

请注意,MAX这里不是一种常数,VARCHARVARCHAR(MAX)是非常不同的类型,后者非常接近TEXT

的SQL Server的早期版本你不能直接访问TEXT,你只能得到一个TEXTPTRREADTEXTWRITETEXT功能使用它。

SQL Server 2005中您可以直接访问TEXT列(虽然你仍然需要一个显式的VARCHAR为它们分配一个值)。

TEXT好:

  • 如果你需要较大的文本存储在数据库中
  • 如果如果你很少选择此列,难道你不列上
  • 值搜索加入它。

VARCHAR好:

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

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

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

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

什么TEXT是良好的一些例子:

  • 博客评论
  • Wiki页面
  • 代码源

什么VARCHAR有利于一些例子:

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

作为一个经验法则,如果你需要你的文本价值超过字符不使用加入此列,使用TEXT

否则使用VARCHAR

P.S.同样适用于UNICODE启用NTEXTNVARCHAR以及上面的示例。

P.P.S.这同样适用于VARCHAR(MAX)NVARCHAR(MAX),即SQL Server 2005+使用而不是TEXTNTEXT。如果您希望它们始终存储在行外,您需要为它们启用large value types out of row,并使用sp_tableoption

如上文和here提到,TEXT会在未来的版本中被取消:

The text in row option will be removed in a future version of SQL Server. Avoid using this option in new development work, and plan to modify applications that currently use text in row . We recommend that you store large data by using the varchar(max) , nvarchar(max) , or varbinary(max) data types. To control in-row and out-of-row behavior of these data types, use the large value types out of row option.

SQL Server Text type vs. varchar data type

+0

因此,我建议使用'Text'作为变量类型 – SacrumDeus

+2

很好的答案。只有一个小故障:问题是关于MySQL而不是MS SQL服务器。 – Shadow

+0

@SacrumDeus谢谢你的答案,它是精心制作的。我可以看到你在与Microsoft SQL服务器的上下文中表达。如果你可以向MySQL保证,那真的会有帮助。 –

相关问题