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 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势