我使用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開始的,他們掉下來,我得到插入到數據庫中的一個數字。
例如,identica
的00123
將轉換爲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});
這仍然覆羽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);
任何想法是怎麼回事?
SOLUTION
這是sqlite的問題,請參見吉姆的意見回答。 STRING
必須在sqlite中爲TEXT
。否則它將它視爲數字!
更改架構如下解決了這個問題:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identica TEXT NOT NULL,
);
什麼是在SQLite中該列的聲明(即類型親和力)?根據文檔,如果它是「TEXT」,它應該將其存儲爲一個字符串;否則會是一個數字。 – 2012-03-19 20:59:15
@JimGarrison請參閱最新的問題。我正在使用'STRING'。讓我試試'TEXT'。 – bodacydo 2012-03-19 21:04:07
@JimGarrison你剛剛救了我的一天。我將它轉換爲'TEXT',它完美的工作! – bodacydo 2012-03-19 21:05:47