MYSQL - 如果我有一个 json 类型的列,我可以根据 JSON 中的内容进行选择

Posted

技术标签:

【中文标题】MYSQL - 如果我有一个 json 类型的列,我可以根据 JSON 中的内容进行选择【英文标题】:MYSQL - If I have a column of type json can I Select based on what's in the JSON 【发布时间】:2020-03-06 16:53:39 【问题描述】:

我有一个保存录音的数据库,每个录音都有用户可以指定的自定义元数据,每次都会有所不同。当我根据元数据中的内容执行 GET 选择时,是否有可能?

<?php
require 'config.php';
require 'database_connector.php';

if (!$_SERVER['REQUEST_METHOD'] === 'GET') 
    var_dump(http_response_code(403));
    die();


$secret = "getSecret";
if ($secret !== $_GET['secret']) 
    var_dump(http_response_code(401));
    die();


$request = (object) [
    'id' => $_GET['id'], 'game_name' => $_GET['game_name'], 'gamer_tag' => $_GET['gamer_tag'], 'limit' => $_GET['limit'], 'id' => $_GET['meta_data']
];
$connection = openConnection($config);
retrieveRecordings($connection, $config, $request);
$connection->close();

function retrieveRecordings($connection, $config, $request)

    $stmt = $connection->prepare("SELECT * FROM $config->tablename WHERE id = ? OR game_name = ? OR gamer_tag = ? OR meta_data = ? LIMIT ?");
    $stmt->bind_param("sssss", $request->id, $request->game_name, $request->gamer_tag, $request->meta_data, $request->limit);
    if (!$stmt->execute()) 
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error . " \r\n";
        die();
    
    $result = $stmt->get_result();
    if ($result->num_rows > 0) 
        while ($row = $result->fetch_assoc()) 
            $id = $row["id"];
            $game_name = $row["game_name"];
            $gamer_tag = $row["gamer_tag"];
            $recording = $row["recording"];
            $meta_data = $row["meta_data"];
            $hex = bin2hex($recording);
            echo ("response=id=" . $id . "\r\n");
            echo ("response=game_name=" . $game_name . "\r\n");
            echo ("response=gamer_tag=" . $gamer_tag . "\r\n");
            echo ("response=meta_data=" . $meta_data . "\r\n");
            echo ("response=recording" . $id . "=" . $hex . "\r\n");
        
     else 
        echo "0 results \r\n";
    

【问题讨论】:

这可能是可能的。请提供示例数据、预期结果以及您当前解决问题的尝试,以便可以尝试为您提供相关的解决方案。 我在当前状态下添加到代码中 见***.com/questions/30411210/… 【参考方案1】:

mysql 5.7 中,有 JSON 函数,因此您可以进行某些类型的搜索。有关文档和示例,请参阅 JSON function reference。

有些类型的搜索过于复杂,无法使用 MySQL 5.7 JSON 函数。所以在 MySQL 8.0 中,他们引入了JSON_TABLE(),它使用起来很复杂,但它可以将 JSON 文档转换为虚拟行和列,所以你可以做任何你通常可以用 SQL WHERE 子句做的事情。

但在任何一种情况下,如果用户可以存储 任意 元数据,例如深度嵌套的 JSON 数组或对象,则很难使其可搜索。 JSON 中有哪些字段?它们在 JSON 中有多深?用户知道如何编写 JSON 搜索语法的可能性有多大?

坦率地说,我不允许用户存储任意 JSON,也不允许用户运行任意搜索。这听起来像是一场噩梦,无法优化,而且可能是一个安全漏洞。

附:您在此行中有两次密钥 'id'。这是行不通的,您只能在散列或对象中拥有每个键一次。我猜你的意思是第二个'id''meta_data'

'id' => $_GET['id'], 'game_name' => $_GET['game_name'], 'gamer_tag' => $_GET['gamer_tag'],
  'limit' => $_GET['limit'], 'id' => $_GET['meta_data']

【讨论】:

以上是关于MYSQL - 如果我有一个 json 类型的列,我可以根据 JSON 中的内容进行选择的主要内容,如果未能解决你的问题,请参考以下文章

具有 Mysql JSON 类型的 Spring Data

如何在 MySQL 中的 json 列上创建索引?

Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势

Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势

查询以连接 MySQL 中的两个 json 数组?

MySQL + JSON = 王炸。。