2012-03-19 18 views
4

我使用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); 

任何想法是怎麼回事?

SOLUTION

這是sqlite的問題,請參見吉姆的意見回答。 STRING必須在sqlite中爲TEXT。否則它將它視爲數字!

更改架構如下解決了這個問題:

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

什麼是在SQLite中該列的聲明(即類型親和力)?根據文檔,如果它是「TEXT」,它應該將其存儲爲一個字符串;否則會是一個數字。 – 2012-03-19 20:59:15

+0

@JimGarrison請參閱最新的問題。我正在使用'STRING'。讓我試試'TEXT'。 – bodacydo 2012-03-19 21:04:07

+0

@JimGarrison你剛剛救了我的一天。我將它轉換爲'TEXT',它完美的工作! – bodacydo 2012-03-19 21:05:47

回答

3

使用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(); 

UPDATE:

閱讀type affinity in SQLite。由於您的列類型爲STRING(技術上不支持),因此它默認爲INTEGER關聯。您需要將其創建爲TEXT

+0

感謝您的回答。我嘗試過,但沒有幫助。我做了更多的實驗,請看我更新的問題。它看起來像sqlite3是放棄領先的0它的一切本身! – bodacydo 2012-03-19 21:02:58

+0

謝謝。請留下您的原始答案,因爲它也很有見地。請結合兩個答案! – bodacydo 2012-03-19 21:08:53

+0

添加了原來的答案。祝您好運。 – 2012-03-19 21:10:53

1

根據文檔,如果列類型(親和力)是TEXT,它應該將其存儲爲字符串;否則會是一個數字。