【问题标题】:DBI: How to find the right data-types for unknown data?DBI:如何为未知数据找到正确的数据类型?
【发布时间】:2011-03-06 12:37:57
【问题描述】:

您更喜欢这两种方法中的哪一种:尝试找到正确的数据类型还是简单地使用 always varchar?

# ...
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 );

【问题讨论】:

  • 如果您需要在保存后处理数据,例如搜索/indexing/retriveing它,那么只有你需要正确的数据类型,否则如果你只需要存储和显示,我推荐varchar。

标签: database perl types dbi


【解决方案1】:

如果您正在处理的表不会更改,并且如果该列仅用于该单个表的数据,那么猜测似乎适合的数据类型是安全的(版本 1)。

但是,如果您打算向该列添加更多数据,那么您需要将所有内容保留为 varchars,以防将来出现一些不同类型的数据(版本 2)。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2020-03-29
    • 1970-01-01
    • 2015-09-19
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多