2011-04-21 81 views
2

在我的项目中用户可以写评论[纯文本],并查看其他评论,可以删除自己的评论,但无法更新评论!
在这种情况下,我应该使用?varchar vs text - MySQL

Text or Varchar(4048)
Text和Varchar的优点和缺点(像4000这样大)
如果我只替换'<'和'& lt',它足够安全吗?和'>'与'& gt';'确保一切都很好
[我不想把所有那些喜欢“”& ......,为了节省空间,我只是想确保用户无法写javascript]

定于前端的限制

+0

任何人都可以说或猜测FB/Orkut用于保存文本的内容:O? – Sourav 2011-04-21 03:44:25

回答

1

为了保护自己免受XSS攻击,使用htmlentities函数对其进行编码

除此之外,数据类型的选择主要与内容的大小有关。如果它可能超过4048个字符,则使用文本数据类型。如果许多帖子很大,使用文本数据类型可能会减少浪费的数据空间,并且可能会比巨大的varchar执行得稍微好一些,但这取决于您的情况,最好测试替代方案。

我通常更喜欢varchar,因为从编码的角度来看它更容易处理,如果没有其他内容,并且如果内容可能超过varchar的大小则回退到文本。

+0

我只是在等待听到XSS,如何有人可以做出与< and >的XSS,因为我认为没有< and >脚本失去了它的力量,如果你能举一些例子来说明究竟是哪个字符转换(htmlentitles)到注意安全 ? – Sourav 2011-04-21 03:41:46

+0

不要试图分散角色。特别是当你超出UTF8字符集时,事情变得非常棘手。使用htmlentities函数是最简单的,也是最好的选择,我想不出一个原因,不要仅仅用它来尝试自己做别的事情。 http://php.net/manual/en/function.htmlentities.php上有很多例子。 – squawknull 2011-04-21 03:58:42

+0

应在使用_displaying_文本时使用'htmlentities',而不是在存入数据库时​​使用'htmlentities'。 – 2016-08-20 22:44:31

3

的Varchar通常更快,在检索时规模是合理的,因为它是存储的表,其中的文本存储假表的指针位置内。

感谢

+0

如果varchar的大小是4000,它会更快吗?和thnx回复:) – Sourav 2011-04-21 03:38:17

+0

这取决于你使用的硬件,你最好做一个基准。谢谢... – 2011-04-21 03:40:05

+0

如果您在varchars中存储了大量的大值,那么在许多数据库中存在增加的数据文件碎片的可能性。使用mysql,它会变得更加复杂,因为它取决于具体的存储引擎是如何工作的(并且这总是会随时发生变化)。因此,如果我认为大部分字段都会在较小的范围内,那么只需使用varchar即可。如果很多会很大,请使用文本。 – squawknull 2011-04-21 03:52:45

1

它取决于应用程序行为。在块表内分配的空间减少了其他列的空间,并减少了其内部的密度数据。如果mysql使用全表扫描,则扫描很多块,效率不高。 所以它取决于你的SQL请求。

2

(你有多个问题。我将解决一个是在标题)

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

对于小于4000的值,有些情况下复杂SELECT中的临时表将运行得更快,例如VARCHAR(255)TINYTEXT快。出于这个原因,我觉得不应该使用TINYTEXT