rawurlencode用于存储数据

时间:2012-04-20 11:02:06

标签: php mysql

我一直使用rawurlencode将用户输入的数据存储到我的mysql数据库中。我这样做的主要原因是,我找到了非常简单的外国字符。然后我使用rawurldecode来检索和显示数据。

我在某处读过rawurlencode并不是为了这个目的。我正在做什么有任何不利之处?


所以,假设我有一个带有许多字符的德语地址,例如变形金刚等。将这个存储在mysql数据库中的最简单方法是什么,没有出现错误的风险并且可以使用搜索脚本进行搜索?到目前为止,rawurelencode对我们的系统来说非常出色。也许这种做法可以通过仅编码外来字母而不是像空格等常见字符来改进,这是浪费空间我完全同意。

3 个答案:

答案 0 :(得分:1)

当然有。

让我们从实际开始:对于大类字符,您为每个数据字节花费3个字节的存储空间。 rawurlencode(当然还有RFC)的描述表明这些字符是

  

除-_ .~

之外的所有非字母数字字符

这意味着总共有26 + 26 + 10(字母数字)+4(特殊例外)= 66个字符,你浪费空间。

然后还存在逻辑上的缺点:您不是存储数据本身,而是存储为URL定制的数据。除非数据本身是URL,否则这不是你应该做的。

答案 1 :(得分:0)

我能想到的缺点:

  • 浪费磁盘空间。
  • 每次读取和每次写入都会浪费CPU周期进行编码和解码。
  • 额外的复杂性(您甚至无法使用MySQL客户端检查数据)。
  • 无法使用全文搜索。
  • URL编码不一定是唯一的(至少有两个RFC)。它可能不会导致数据丢失,但它可能导致重复数据(例如,两行实际包含同一条数据的唯一索引)。
  • 您可能会意外编码非字符串数据,例如日期:2012-04-20%2013%3A23%3A00

但主要的考虑因素是这种技术是完全随意和不必要的,因为MySQL存储完整的Unicode目录没有最小的问题。您还可以决定在所有字符串中交换e和o:Holle, werdl!。您的应用程序运行正常,但不会提供任何附加价值。

更新:作为Your Common Sense points out,基本为ORDER BY的SQL子句不再可用。并不是说国际角色会被忽视;你基本上会根据%和十六进制字符的ASCII码得到一个任意的排序顺序。如果你不能SELECT * FROM city ORDER BY city_name可靠,那么你的数据库就没用了。

答案 2 :(得分:0)

  • 我用叉子吃汤
  • 我正在使用金钱账单来点燃煤炭烧烤
  • 我正在用水壶煮鸡蛋。
  • 我用显微镜锤击钉子。

我正在做什么有任何不利之处?

您使用的工具不是故意的。这总是一个缺点。

一个理智的人类总是使用专门用于某项工作的工具。不是一些随机挑选的。 特别是如果正确的工具供应没有短缺。

URL 编码不适用于数据库,可以从名称中看出。对于理智的开发人员来说,这就足够了。环顾四周:找到合适的工具。

有一种称为“常识”的东西 - 在常规生活中广泛使用的东西,但由于某些原因,在php世界中总是缺席。
常识可以警告我们:如果我们使用错误的工具,它可能会破坏工作。它迟早会破坏它。无需询问某些细节 - 这是一般规则。我们正在大约5岁时学习这条规则。

为什么不在玩一些网络游戏时使用它呢?

为什么不问自己一个问题:

存储外国字符有什么问题?

  

urlencode使stroing外来字符变得非常简单

你遇到没有urlencode的任何困难?

虽然我觉得常识应该足以回答这个问题,但人们总是在寻找“预兆”,证明。你在这里:

数据库的工作不仅限于存储和检索数据。纯文本文件也可以处理这样的原始任务 数据操作是我们使用数据库的原因 最广泛使用的是排序过滤

  • 像数据库这样非常智能的东西可以对数据字符不敏感进行排序和过滤,这是非常方便的功能。但是,当然只有当字符按原样保存时才可以完成,而不是作为一些随机代码。
  • 排序文本也可以使用字符表中除二进制顺序之外的顺序。某些变音字符可能出现在表的其他部分,但数据库 collat​​ion 会将它们放在正确的位置。当然,只有当字符按原样保存时才可以完成,而不是作为一些随机代码。
  • 有时我们必须操纵已存储在数据库中的数据。比如说,从字符串中剪切一些片段并与输入的值进行比较。如何用urlencoded数据完成它?