0

我想在 MySQL 表中保存一个 json 字符串。json 字符串来自画布(使用 fabricjs)。

var jsonCanvas = JSON.stringify(canvas.toDatalessObject());

我的第一个问题是,在 MySQL 中保存 json 字符串的最佳数据类型是什么?画布将包含图像以及文本和其他对象。你觉得 MEDIUMTEXT 够用吗?

另一个问题。是否可以使用此准备好的语句保存 json 字符串。我怀疑是否将关键字“s”用于字符串。

try {
  $sql = "insert into layout (lt_author, lt_date, lt_category, lt_json_string)
   values (?,?,?,?)";
  $stmt = $mysqli->prepare($sql);
  $stmt->bind_param("ssss",$lt_author, $lt_date, $lt_category, $lt_json_string);
  $stmt->execute();
  $stmt->close();

谢谢你的帮助 :) 问候 Max

4

1 回答 1

0

我假设您的 SQL 是正确的。
我总是选择TEXT存储我的画布的 json 字符串表示。
但是在您选择如何保存 JSON 表示之前,需要考虑一些事情。
请在此处查看此讨论:使用 fabric.js 在画布中加载 JSON
它解释了您需要注意的要点。

  • 使用.toDatalessObject()替代.toJson()方法:
  • - 优点:正如 kangax 在讨论中解释的那样,toDatalessObject 将只保存 svg 的 url 源,因此需要保存在数据库中的数据更少。通过这种方式,您也许可以使用其他类型来存储您的 json 画布表示形式(也许您可以使用一种TINYTEXT类型)
    - 缺点:您需要在服务器中有文件,因为您将在再次加载画布时引用它。

  • 你的画布上有多少物体?这个对象是什么类型的?是更多的 svg 还是图像和文本?
  • 你需要知道,因为如果你使用.toDatalessJson()方法并且你将在你的画布中加载更多的 svg,这个 svg 将被转换为对象,Path并将PathGroup保存在你的数据库中。
    因此,如果您的画布中有很多很多 svg,那么最终的 json 字符串可能会溢出TEXT数据库中类型允许的大小(如果发生这种情况,有一些解决方案,例如拆分您的 json 字符串表示并保存在两个或多个条目中您的数据库)。
    但是,如果这种情况经常发生,也许会更好地选择其他类型,MEDIUMTEXT如您所建议的那样。

    于 2013-01-06T20:58:51.310 回答