gpt4 book ai didi

perl - 通过 Perl 的 DBI $sth->execute() 函数将字符串插入数据库时​​将其转换为数字

转载 作者:行者123 更新时间:2023-12-03 16:19:02 25 4
gpt4 key购买 nike

我正在使用 Perl 的 DBI 和 SQLite 数据库(我安装了 DBD::SQLite)。我有以下代码:

my $dbh = DBI->connect("dbi:SQLite:dbname=$db", "", "", { RaiseError => 1, AutoCommit => 1 });
...
my $q = "INSERT OR IGNORE INTO books (identica, book_title) VALUES (?, ?)";
my $sth = $dbh->prepare($q);
$sth->execute($book_info->{identica}, $book_info->{book_title});

我遇到的问题是 $book_info->{identica}以 0 开头,它们被删除,我在数据库中插入了一个数字。

例如, identica00123将被转换为 123 .

我知道 SQLite 没有类型,所以我如何让 DBI 插入 identica作为字符串而不是数字?

我尝试将其引用为 "$book_info->{identica}"当传递到 $sth->execute但这没有帮助。

编辑

即使我直接在查询中插入值它也不起作用:
my $i = $book_info->{identica};
my $q = "INSERT OR IGNORE INTO books (identica, book_title) VALUES ('$i', ?)";
my $sth = $dbh->prepare($q);
$sth->execute($book_info->{book_title});

这仍然隐蔽 00123123 , 和 00000000099 ...

编辑

天哪,我在命令行上做了这个,我得到了这个:
sqlite> INSERT INTO books (identica, book_title) VALUES ('0439023521', 'a');
sqlite> select * from books where id=28;
28|439023521|a|

它被 SQLite 删除了!

以下是架构的外观:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identica STRING NOT NULL,
);

CREATE UNIQUE INDEX IDX_identica on books(identica);
CREATE INDEX IDX_book_title on books(book_title);

任何想法发生了什么?

解决方案

这是sqlite问题,请参阅Jim评论中的答案。 STRING必须是 TEXT在sqlite中。否则它会将其视为数字!

将架构更改为以下解决了它:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identica TEXT NOT NULL,
);

最佳答案

使用 bind params

my $sth = $dbh->prepare($q);
$sth->bind_param(1, 00123, { TYPE => SQL_VARCHAR });
$sth->bind_param(2, $book_info->{book_title});
$sth->execute();

更新:

阅读 type affinity in SQLite .因为你的列类型是 STRING (技术上不受支持),它默认为 INTEGER 亲和性。您需要将列创建为 TEXT反而。

关于perl - 通过 Perl 的 DBI $sth->execute() 函数将字符串插入数据库时​​将其转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com