用于各种用户输入表的MySQL VARCHAR vs TEXT

时间:2012-02-12 00:16:51

标签: php mysql

所有

我正在编写一个可以接收用户生成的文本内容的网络应用。其中一些输入将是几个单词,有些将是几句长。在超过90%的情况下,输入将少于800个字符。 输入需要可搜索。输入将包含各种字符集,包括亚洲字符集。站点和数据库基于utf8。

我大致了解VARCHAR和TEXT之间的权衡。我想象的是同时拥有一个VARCHAR和一个TEXT表,并根据它们的大小在一个或另一个上存储输入(这应该可以通过PHP脚本来实现)。

您如何看待基于数据的数据表?另外,为各种大小范围创建几个VARCHAR表是否有意义?我的猜测是,我将获得围绕几个密钥大小聚集的大量用户输入。

谢谢,

JDelage

3 个答案:

答案 0 :(得分:5)

根据输入的大小将值存储在一列与另一列中,这将增加应用程序的复杂性,而不是它的价值。

对于MySQL中的VARCHAR vs TEXT,这里有一个很好的讨论,MySQL: Large VARCHAR vs TEXT

“棘手”部分是在这个字段上进行全文搜索,这需要使用MyISAM存储引擎,因为它是唯一支持全文索引的引擎。另外值得注意的是,有时以使系统架构复杂化为代价,使用像Apache Solr这样的东西可能是值得的,因为它可以更有效地执行全文搜索。很多人在他们的MySQL数据库中拥有大部分数据,并使用像Solr这样的文本列进行全文索引,然后使用该索引进行花哨的搜索。

Re:Unicode。我已经使用Solr对带有Unicode字符的文本进行全文索引。

答案 1 :(得分:4)

评论是正确的。您只使用VARCHAR上的TEXT数据类型添加1个字节。

存储要求:

  • VARCHAR字符串长度+ 1个字节
  • TEXT字符串长度+2个字节

答案 2 :(得分:1)

我看到它的方式是你有两个选择:

  • 将它保存在TEXT中,它会在存储上浪费一个额外的字节,并在搜索时浪费额外的X处理能力。
  • 将其保存在VARCHAR中,创建名为A_LOT_OF_TEXT的附加表,其结构为(int row_id_of_varchar_table,TEXT)。如果数据足够小,则将其放在varchar中,否则放置预定义的值而不是数据,例如'THE_DATA_YOU_ARE_LOOKING_FOR_IS_IN_TABLE_NAMED_A_LOT_OF_TEXT'或只是NULL并将实际数据放到表A_LOT_OF_TEXT