我的所有基于文本的字段长度在数据库中是否为四倍以允许额外的存储?
寻找最佳实践而不是坚实的是或否:-)
解决方法
如果是应用数据,我认为最好:
>以环境原始形式(例如数据库中未编码的)表示它,
>确保它正确翻译,因为它跨越表示边界(编码时,您生成HTML页面).
如果您是MVC的粉丝,这也有助于将视图/控制器与模型(以及永久存储格式)分离开来.
表示
例如,假设有人发表评论“我喜欢M& Ms”.它可能是最简单的代码中的纯文本字符串“我喜欢M& Ms”,而不是HTML编码的字符串“我喜欢M& amp; Ms”.在技术上,代码中存在的数据不是HTML,如果数据被尽可能简单地表示,生命是最简单的.该数据可以稍后在不同的视图中使用,例如.桌面应用该数据可以存储在数据库,平面文件或XML文件中,可能以后与其他程序共享.其他程序最简单的假设字符串是“native”表示形式,在数据库和平面文件中的“我喜欢M& Ms”和XML文件中的“我喜欢M& amp; Ms”.我会紧张地看到编码在XML文件中的HTML编码值(“I love& amp; amp; Ms”).
翻译
后来,当数据即将跨越表示边界(例如,以HTML格式显示,存储在数据库中,纯文本文件或XML文件)时,它的重要性是确保它被正确地翻译,以便在格式化为下一个环境.简而言之,当您在HTML页面上显示时,请确保将其翻译成正确编码的HTML(手动或通过工具),以便该值准确显示在页面上.当您将其存储在数据库中或在查询中使用它时,请使用转义和/或准备语句和绑定变量来确保将相同的概念值准确地表示到数据库.当您将其存储在XML文件中时,您可以确保其XML编码.
跨越表示边界时未能正确翻译是注入攻击的来源,例如sql注入攻击.当您使用多种表示/语言(例如Java,sql,HTML,Javascript,XML等)时,请慎重.
–
另一方面,如果您真的要将HTML页面片段保存到数据库中,那么我不清楚您在“存储之前编码”的含义.如果它是严格有效的HTML,则所有必需的值都应该已经被编码(例如& amp;& lt; lt等等).