【问题标题】:php/mysql : How to insert a gzcompress-ed string into a text mysql field?php/mysql : 如何将 gzcompress-ed 字符串插入文本 mysql 字段?
【发布时间】:2011-12-15 06:52:31
【问题描述】:

我一直在尝试将一个 json 编码的字符串压缩并存储到 mysql 中,但我收到“意外 /”错误。

我也尝试过像这样使用 addlashes:

addslashes(gzcompress(json_encode($mystring)));

并显示

json_decode(gzuncompress(stripslashes($mystring)));

但是插入失败,出现我提到的错误。

我在某处读到了一个带有 gzcompress 的字符串应该存储为 blob,但我希望有一种方法可以将它存储在 mysql 文本字段中,这样我就不必弄乱数据库了。

PS:有些人在这里要求提供完整的错误信息:

警告:输入中出现意外字符:'\' (ASCII=92) state=1

PDOException: SQLSTATE[HY000]: 一般错误: 1366 字符串不正确 值: '\x9C\xED}\x8Br\xDB...' 列 'field_text_value' 在 第 1 行。

【问题讨论】:

  • 应该使用 mysql_real_escape_string 而不是添加斜杠(并不是说这会解决这个问题;我的意思是一般来说)。 addlashes 不知道字符集,而 mysql_real_escape_string 实际上知道数据库连接,可以更准确地转义数据。 addlashes() 是 PHP 为帮助编码人员所做的许多不应该做的事情之一。
  • 感谢 Corbin,我也会检查一下。顺便说一下,谁减去这个,请解释原因。
  • 在关系数据库中存储“大数组”没有多大意义。向他们提供的问题不是完整的错误消息,而是提供一个存根说“意外/”的问题就更没有意义了。甚至无法判断,这个 stub 是代码的哪一部分发出的
  • @Corbin mysql_real_escape_string 也不知道,除非您另有明确说明。因此,仅建议“使用它,而不是添加斜杠”实际上根本不会改变。
  • 你确定吗? “转义 unescaped_string 中的特殊字符,考虑到连接的当前字符集,以便将其放在 mysql_query() 中是安全的。”而关于可选的连接参数:“如果没有指定链接标识符,则假定最后一个被mysql_connect()打开的链接。”

标签: php mysql text compression gzip


【解决方案1】:

将其存储为BLOB。即使有一种方法可以将其存储在 VARCHAR 或 *TEXT 字段中,并且可以在往返中幸存下来,这也是一种可怕的方式。

您确定还需要压缩吗?

您也可以让 MYSQL 进行压缩,例如INSERT INTO mytable (compressed_json) VALUE (COMPRESS('[\"the json\"]').

【讨论】:

  • 谢谢,我不确定,但 gzcompress 看起来是一种压缩字符串的好方法。将调查 blob 方式。
  • gzcompress 生成二进制数据。 BLOB 列数据类型存储二进制数据。如果您不使用 gzcompress,则使用 BLOB 毫无意义。 (所有“blob”说的是“mysql,不要尝试重写这些位。这不是文本,它没有编码”。如何放入你的位,无论是使用 gzcompress 还是COMPRESS(),都取决于你。)
  • 感谢它与 BLOB 一起使用。非常感激。使用 gzcompress 占用更少的空间。
  • 最终数字出来了,设法将包含 30 000 条记录、1.7 GB、大型 json 编码数组的表压缩到 300 MB:D WOW 真棒。添加了一个新的 blob 字段,导入文本字段并 gz 压缩它。然后删除旧字段。
【解决方案2】:

为什么要将 gzip 压缩字符串添加到数据库中?你为什么不把它存储为:

mysql_real_escape_string(json_encode($myArray)))

【讨论】:

  • 这是一个很大的数组,我希望压缩能让数组 json 编码的字符串更小。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2015-08-24
  • 2022-01-18
  • 2010-10-19
  • 2018-05-04
相关资源
最近更新 更多