varchar与text有何不同 - MySQL

3
在我的项目中,用户可以编写评论[纯文本],查看其他评论,可以删除自己的评论,但不能更新评论!在这种情况下,我应该使用哪个? Text 或 Varchar(4048)? Text 和 Varchar(大约4000)有什么优缺点? 如果我只用'<'替换'& lt;'和'>'替换'& gt;',那么它是否足够安全? [我不想转换所有这些内容,例如'" & ...',以节省空间,我只想确保用户无法编写JavaScript]
前端会有限制。

有人能说出或猜测一下FB/Orkut用什么来保存文本吗? - Sourav
可能是MySQL:Large VARCHAR vs. TEXT?的重复问题。 - Evan Carroll
4个回答

4

当大小合理时,Varchar在检索时通常更快,因为它存储在表内,而TEXT则存储在表外并带有指向位置的指针。

谢谢


如果varchar大小为4000,速度会更快吗?谢谢回复 :) - Sourav
这取决于您使用的硬件,最好对其进行基准测试。谢谢... - Just a PHP Programmer
如果在许多数据库中存储了大量的varchar值,则存在数据文件碎片化的潜在风险。对于MySQL而言,这会更加复杂,因为它取决于特定存储引擎的工作方式(并且这总是可能改变的)。因此,如果我认为大多数字段将在较小的范围内,就使用varchar。如果其中许多字段很大,就使用text。 - squawknull
使用TEXT不会增加数据文件的碎片化吗? - zac1987
“存储在表外”是指InnoDB中的某些ROW_FORMATsVARCHAR(4000)TEXT都受此影响,因此这实际上并没有什么区别。 - Rick James

2

您有多个问题,我将解答标题中的一个问题。

VARCHAR(4000)TEXT之间唯一的区别是,INSERT会分别截断为4000个字符或65536个字节。

对于小于4000的值,在复杂的SELECT中临时表将使用VARCHAR(255)TINYTEXT更快。基于这个原因,我认为从来不应该使用TINYTEXT


1
为了防止XSS攻击,使用htmlentities函数对其进行编码。
除此之外,数据类型的选择主要取决于内容的大小。如果可能超过4048个字符,则使用文本数据类型。如果许多帖子都很大,使用文本数据类型可能会减少浪费的数据空间,并且可能比巨大的varchar表现略好,但这取决于您的情况,最好测试替代方案。
我通常更喜欢varchar,因为从编码角度来看更容易处理,如果没有其他问题,如果内容可能超过varchar的大小,则回退到文本。

我只是在等待听到关于XSS的内容,但是如果没有使用<和>符号,有人如何进行XSS攻击呢?因为我认为如果没有<和>符号,脚本就失去了它的力量。如果您能提供一些确切的字符转换(htmlentitles)的示例以确保安全,那将不胜感激。 - Sourav
不要试图逐个处理字符。特别是当你超出UTF8字符集时,事情会变得非常棘手。使用htmlentities函数是你最简单、最好的选择,我想不到任何理由不使用它而尝试做其他事情。在http://php.net/manual/en/function.htmlentities.php上有很多例子。 - squawknull
1
应该在显示文本时使用“htmlentities”,而不是在存储到数据库中时使用。 - Rick James

1

这取决于应用程序的行为。在块表内分配的空间会减少其他列的空间,并降低其中的数据密度。如果MySQL使用全表扫描,则会扫描许多块,这是低效的。因此,这取决于您的SQL请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接