在MySQL字段中保存Perl Hash(键/值数据结构)

时间:2015-10-15 12:23:40

标签: perl

我有一个perl哈希,我想保存在数据库字段(MySQL)中,以便我可以立即检索它以进行更新。

反过来说,我想定义一个旨在保存perl哈希值的数据字段(MySQL)。

这是可能的,实现它的最佳做法是什么?

3 个答案:

答案 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'引用)。而且你仍然需要重新阅读并解析它,这就是你必须对JSONXML所做的。你最终以最糟糕的方式解决这个问题。

答案 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)文档中的数据。"