• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

DBI:如何为未知数据找到正确的数据类型?

数据库 来源:sid_com 15次浏览

有了这两种方法,你会更喜欢:试图找到正确的数据类型或简单地使用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)中有一些不同类型的数据。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)