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

回到顶部