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で始まる場合、それらが削除され、データベースに数値が挿入されることです。

たとえば、identicaof00123はに変換され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そして...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の問題です。ジムのコメントの回答を参照してください。はsqliteでSTRINGある必要があります。TEXTそれ以外の場合は、数値として扱います。

スキーマを次のように変更すると、問題が解決しました。

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

2 に答える 2

3

バインドパラメータを使用する

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

アップデート:

SQLiteの型アフィニティについて読んでください。列タイプはSTRING(技術的にサポートされていない)ため、デフォルトでINTEGERアフィニティになります。代わりに、列を作成する必要がありますTEXT

于 2012-03-19T21:00:12.853 に答える
1

ドキュメントによると、列の型 (アフィニティ) が TEXT の場合、文字列として格納する必要があります。それ以外の場合は数値になります。

于 2012-03-19T23:08:40.590 に答える