Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Perl'将字符串插入数据库时转换为数字;s DBI$sth->;execute()函数_Perl_Sqlite_Type Conversion_Dbi_Dbd - Fatal编程技术网

通过Perl'将字符串插入数据库时转换为数字;s DBI$sth->;execute()函数

通过Perl'将字符串插入数据库时转换为数字;s DBI$sth->;execute()函数,perl,sqlite,type-conversion,dbi,dbd,Perl,Sqlite,Type Conversion,Dbi,Dbd,我正在使用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-

我正在使用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开头时,它们会被删除,而我会在数据库中插入一个数字

例如,
00123
identica
将转换为
123

我知道SQLite没有类型,那么如何使DBI将
identica
作为字符串而不是数字插入呢

当传递到
$sth->execute
时,我尝试将其引用为
“$book\u info->{identica}”
,但这没有帮助

编辑

即使我直接在查询中插入值,它也不起作用:

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});
这仍然将
00123
转换为
123
0000000009
转换为
9

编辑

天哪,我是在命令行上做的,我得到了:

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评论中的答案。
字符串
必须是sqlite中的
文本
。否则它会将其视为数字

将架构更改为以下解决方案:

CREATE TABLE books (
  id                INTEGER PRIMARY KEY AUTOINCREMENT,
  identica          TEXT  NOT NULL,
);
使用

更新:


了解。因为您的列类型是
STRING
(技术上不支持),所以它默认为整数关联。您需要将列创建为
TEXT

根据文档,如果列类型(关联)为TEXT,则应将其存储为字符串;否则它将是一个数字。

该列在SQLite中的声明(即类型关联)是什么?根据文档,如果是
文本
,则应将其存储为字符串;否则它将是一个数字。@JimGarrison请查看更新的问题。我正在使用
字符串
。让我试试
TEXT
@JimGarrison你刚刚救了我一天。我将其转换为
文本
,效果非常好!我发布了我的建议作为回答。注意,在sqlite中,不需要
integer主键自动递增
——每个表都有一个隐式
rowid
列。谢谢您的回答。我试过了,但没用。我做了更多的实验,请看我更新的问题。看起来sqlite3正在删除前导0的全部内容!谢谢请留下你的原始答案,因为它也是有洞察力的。请结合两个答案!将原始答案添加回。祝你好运。
my $sth = $dbh->prepare($q);
$sth->bind_param(1, 00123, { TYPE => SQL_VARCHAR });
$sth->bind_param(2, $book_info->{book_title});
$sth->execute();