我有一个perl哈希,我想保存在数据库字段(MySQL)中,以便我可以立即检索它以进行更新。
反过来说,我想定义一个旨在保存perl哈希值的数据字段(MySQL)。
这是可能的,实现它的最佳做法是什么?
答案 0 :(得分:3)
这是不可能的,因为哈希是内存中的数据结构。它可能有指针,缓冲区等。因此,您不能只将它推入表空间。
把它变成一个单一的东西"然后你可以藏匿和检索。
您可以使用多种方式执行此操作 - 一些常见的方法可能是:
Storable
(perl中的核心,生成二进制数据,而不是特别便携)。 JSON
- 很常见,因此便携。生成纯文本。 XML
- 与JSON
类似,但有一些不同的使用方案。 您使用的内容在很大程度上取决于您尝试完成的任务。一个非常粗略的示例可能是使用freeze
中的thaw
/ Storable
并通过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
。这是一个坏主意,因为虽然看起来它适用于琐碎的结构,但有一些陷阱(例如' parent'引用)。而且你仍然需要重新阅读并解析它,这就是你必须对JSON
或XML
所做的。你最终以最糟糕的方式解决这个问题。
答案 1 :(得分:1)
听起来不是一个好主意,请参阅use Storable;
store \%hash, 'file';
my $hashref = retrieve('file');
对类似帖子的回复:Store hash in mysql
我建议使用Storable将数据结构存储在文件中
my @keys = keys %hash;
my @values = values %hash;
my $sth = $dbh->prepare("INSERT INTO tablename(id, value) VALUES (?,?);");
$sth->execute_array({},\@keys, \@values);
你可以尝试以下方法:
{{1}}
答案 2 :(得分:0)
如果您确定可以将数据序列化为JSON,则可以使用具有MySQL的JSON数据类型的列。
"从MySQL 5.7.8开始,MySQL支持本机JSON数据类型,可以高效访问JSON(JavaScript Object Notation)文档中的数据。"