如何在 MySQL 数据库中存储 JSON 字符串

Posted

技术标签:

【中文标题】如何在 MySQL 数据库中存储 JSON 字符串【英文标题】:How to store JSON string in MySQL db 【发布时间】:2012-02-17 22:21:34 【问题描述】:

我使用下面的代码将 JSON 数据存储在 mysql 表中。如果 JSON 很短但会因较长的文本而中断,则它可以正常工作。 “field_json”是一个 LONGTEXT。

$sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string'
    WHERE id = $userid");
$result = mysql_query($sql);

我得到的错误是:

无效查询:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在'G附近使用 '","username":"C0WB0Y","lastName":"","id":31874363,"pathToPhoto":"22960/photo' 在第 2 行

【问题讨论】:

请,请,请考虑使用prepared statements。好吧,只有当您希望您的网站不受黑客攻击时... 作为一个侧节点,如果你将 JSON 存储在 mysql 表中,也许你应该考虑使用更适合存储此类数据的数据库,如 CouchDB、MongoDB 等 好点。这仅适用于我想保存 json 以防我必须再次处理它的导入作业 【参考方案1】:

使用占位符,否则容易受到 SQL 注入:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

否则,这里有一个快速修复:http://php.net/manual/en/function.mysql-real-escape-string.php

$sql = sprintf(
        "UPDATE mytable SET field_json = '%s' WHERE id = '%s'",
        mysql_real_escape_string($json_string),
        mysql_real_escape_string($userid)
);
$result = mysql_query($sql);

编辑

请使用 PDO (http://www.php.net/manual/en/book.pdo.php)。从 5.5 开始,mysql 扩展已被弃用

【讨论】:

$userid 可以进行 SQL 注入。您可以使用(int) $userid 代替 mysql_real_escape_string。 问题没有指定 id 字段的数据类型,但在我工作过的系统中,用户 id 是 uuid,而不是 int。【参考方案2】:

试试这个

    $json_string = mysql_real_escape_string( $json_string );
    $sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string'
    WHERE id = $userid");
    $result = mysql_query($sql);

【讨论】:

可以使用 $userid 进行 SQL 注入【参考方案3】:

转义 JSON 字符串:

$json_string = mysql_real_escape_string( $json_string);

$sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string'
    WHERE id = $userid");
$result = mysql_query($sql);

【讨论】:

在您的示例中,$userid 可能会导致 SQL 注入。 它可以,但我们不仅不知道$userid 来自哪里,它也不是 OPs 问题的根源。 虽然不是 OP 问题,但提供的示例默默地留下了潜在的安全问题。 谢谢。关于安全的好点。这是一项导入工作,因此安全不是问题。【参考方案4】:

您需要转义 JSON 字符串中的引号 - 否则它们会终止 SQL 查询,从而导致您遇到异常。

【讨论】:

以上是关于如何在 MySQL 数据库中存储 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何定义一个表来存储 MySQL 数据库中的 JSON 对象?

如何在mysql的json列中存储特殊字符

如果将json格式数据存储到类似mysql这样的关系型数据库中,怎么查

C++下如何将json数据存入mysql数据库

mysql - 如何确定存储可变字符串的字段的长度?

从存储在 MySQL 数据库中的 json 字符串中删除 key:value