DBI:如何为未知数据找到正确的数据类型?
有了这两种方法,你会更喜欢:试图找到正确的数据类型或简单地使用always varchar?DBI:如何为未知数据找到正确的数据类型?
# ... use HTML::TableExtract;
my $te = HTML::TableExtract->new(headers => [ 'some headers', 'one', 'two' ], keep_headers => 1);
$te->parse($html_string);
die $te->tables if $te->tables != 1;
(my $grid) = $te->tables;
use DBI;
my $dbh = DBI->connect(...) or die $DBI::errstr;
my $table = 'my_test_table';
my @rows = $grid->rows;
my $header_row = shift @rows;
##### version 1 ####
use Data::Types qw(:all);
my @create_row;
for my $col (0 .. $#$header_row) {
my ($count, $int, $float) = (0, 0, 0);
my $longest = 0;
for my $row (@rows) {
$longest = length $row->[$col] if length $row->[$col] > $longest;
$int++ if is_int($row->[$col]);
$float++ if is_float($row->[$col]);
$count++;
}
if ($int == $count) {
$create_row[$col] = $dbh->quote($header_row->[$col]) . ' int';
}
elsif ($float == $count) {
$create_row[$col] = $dbh->quote($header_row->[$col]) . ' float';
}
else {
$create_row[$col] = $dbh->quote($header_row->[$col]) . " char($longest)";
}
}
$sql = sprintf "CREATE TABLE $table (%s)",
join(', ', @create_row);
$dbh->do($sql);
$sql = sprintf "INSERT INTO $table (%s) VALUES(%s)",
join(',', map { $dbh->quote($_) } @$header_row), join(',', ('?') x @$header_row);
my $sth = $dbh->prepare($sql);
#### version 2 ####
# always varchar
$sql = sprintf "CREATE TABLE $table (%s)",
join(', ', map { "'$_' varchar(60)" } @$header_row);
$dbh->do($sql);
$sql = sprintf "INSERT INTO $table (%s) VALUES(%s)",
join(',', map { $dbh->quote($_) } @$header_row), join(',', ('?') x @$header_row);
my $sth = $dbh->prepare($sql);
回答:
如果您正在处理该表将不会改变,如果列将只用于该单表的数据,那么它是安全的猜测,似乎适合数据类型(第1版)。
但是,如果您打算向该列添加更多数据,则需要将所有内容保留为varchars,以防将来(版本2)中有一些不同类型的数据。
以上是 DBI:如何为未知数据找到正确的数据类型? 的全部内容, 来源链接: utcz.com/qa/260599.html