【发布时间】:2015-10-15 22:04:39
【问题描述】:
我有一个要保存在数据库字段 (MySQL) 中的 perl 哈希,以便立即检索它以进行更新。
相反,我想定义一个用于保存 perl 哈希的数据字段 (MySQL)。
这可能吗?实现它的最佳做法是什么?
【问题讨论】:
-
如果你的很多数据都是这样的,考虑使用像MongoDB这样的NoSQL数据库。
标签: perl
我有一个要保存在数据库字段 (MySQL) 中的 perl 哈希,以便立即检索它以进行更新。
相反,我想定义一个用于保存 perl 哈希的数据字段 (MySQL)。
这可能吗?实现它的最佳做法是什么?
【问题讨论】:
标签: perl
这是不可能的,因为哈希是内存中的数据结构。它可能有指针、缓冲区等。因此你不能把它塞进一个表空间。
你可以做的是序列化它。把它变成一个单一的“东西”,然后你可以存储和检索它。
您可以使用多种方法来执行此操作 - 一些常见的方法可能是:
Storable(perl 中的核心,产生二进制数据并且不是特别便携)。 JSON - 很常见,因此很便携。生成纯文本。 XML - 类似于 JSON,但有一些不同的使用场景。 您使用哪个在很大程度上取决于您要完成的任务。一个非常粗略的例子可能是使用 Storable 中的 freeze/thaw 并通过 base64 将其编码为文本。
use strict;
use warnings;
use Storable qw ( freeze thaw );
use MIME::Base64;
my %test_hash = (
"fish" => "paste",
"apples" => "pears"
);
my $frozen = encode_base64 freeze( \%test_hash );
my %new_hash = %{ thaw (decode_base64 $frozen ) };
print Dumper $new_hash;
但这确实提出了一个问题——你为什么要尝试将一个散列——它是一个数据对象——打包到一个数据库中——该数据库是为处理数据对象而构建的。这样做会两全其美,因为您的数据库实际上对哈希内容视而不见。我建议您需要重新考虑您要在这里做什么。
编辑:从技术上讲,您也可以使用 Data::Dumper 执行此操作 - 它将变量打印为文本,您可以使用 eval。这是一个坏主意,因为虽然它看起来适用于琐碎的结构,但有一些陷阱(例如“父”引用)。而且您仍然必须将其读回并解析它,这就是您对JSON 或XML 所做的事情。你最终会以这种方式解决所有世界中最糟糕的问题。
【讨论】:
听起来不是个好主意,请参阅jeffa 对类似主题的回复:Store hash in mysql
我建议使用 Storable 将数据结构存储在文件中
use Storable;
store \%hash, 'file';
my $hashref = retrieve('file');
您可以尝试以下方法:
my @keys = keys %hash;
my @values = values %hash;
my $sth = $dbh->prepare("INSERT INTO tablename(id, value) VALUES (?,?);");
$sth->execute_array({},\@keys, \@values);
【讨论】:
如果您确定您的数据可以序列化为 JSON,您可以使用 MySQL 的 JSON 数据类型的列。
“从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 数据类型,可以高效访问 JSON(JavaScript 对象表示法)文档中的数据。”
【讨论】: