SQLiteは、数値列への非数値の挿入を受け入れなければ、あまり役に立たないでしょうか?


10

SQLiteでは、次のステートメントが成功し、文字列がSALARYタイプの列に挿入/更新されますINTEGER

update employee set salary='TOO MUCH' where emp_id=1;

ゼロは挿入/更新されませんが、実際の"TOO MUCH"文字列なので、これは自動型変換に関するものではないことに注意してください。

FAQは述べています:

これは機能であり、バグではありません。SQLiteは動的型付けを使用します。データ型の制約は適用されません。任意のタイプのデータを(通常は)任意の列に挿入できます。任意の長さの文字列を整数列に入れたり、浮動小数点数をブール列に入れたり、日付を文字列に入れたりできます。CREATE TABLEコマンドで列に割り当てるデータ型は、その列に入れることができるデータを制限しません。すべての列は、任意の長さの文字列を保持できます。(例外が1つあります。INTEGERPRIMARY KEYタイプの列は64ビットの符号付き整数しか保持できません。整数以外のものをINTEGER PRIMARY KEY列に挿入しようとすると、エラーが発生します。)

したがって、この動作は明らかに意図的なものですが SQLiteがこの動作をするのはなぜでしょか。私が知っている他のほとんどのSQLデータベースはまったく異なる動作をするため、非数値文字列を挿入しようとすると、エラーが発生するか、文字列0に変換されます。数値列。

  • SQLiteライブラリは、この振る舞いなしではあまり役に立ちませんか?

  • これは、ライブラリを小さく高速に保つために設計されたものですか?

  • 文字列を数値列に挿入しようとするとエラーが発生するために、SQLiteライブラリは大幅に遅くなったり大きくなったりしますか?


9
誰かがかつて「機能はマーケティング部門によって説明されたバグである」と言いました。
Dan Pichelman、2015

3
コードサイズにメリットがあるかもしれませんが、パフォーマンスとデータ密度には良いと思います。全体として、私はそれを意図的な(または少なくとも採用された)誤機能と呼びます。
デュプリケータ

3
「リアルタイムのパフォーマンスを必要とする組み込みシステムに通常使用される、小型で低リソースのライブラリを維持するために課せられた制限のようです...」型チェックがドロップ以上のものであるとは想像できません。任意の量のディスクIOを実行する操作の時間/スペースパフォーマンスバケット。また、データのサイズが固定されていると単純に想定できないため、コード内で追加のチェックを行う必要があります。そのため、動的型付けはおそらくパフォーマンスに影響します。
ドバル

1
@DocBrown私がそう言っているのではなく、それがsui generisだからです。
TulainsCórdova15年

2
@ user61852質問を完全に書き直し、SQLiteの動的型付けがパフォーマンス上の利点をもたらすかどうかに焦点を当て、X / Yコンテキストでの動的型付けの機能/バグの区別または一般的な有用性/役に立たない点については省略します。
Doval

回答:


8

いいえ、特に動的型付けには、より多くの記憶域と処理時間の両方が必要です。特に、型の親和性が追加されるため、プログラマーは自由に無視できる優先型になります。これは、実際のトレードオフコストを伴う意図的な機能です。これらのコストは、SQLiteターゲットのユースケースでは事実上無視できますが、それでも存在します。

このような機能を使用できるようにすることに慣れていないため、そのような機能の有用性はわかりにくいものです。その欠如に対する回避策は、あなたにとってより自然に感じられるでしょう。以前の経験から、それは決して他にはならないINTEGERフィールドと考えていますが、SQLiteはそれを任意のタイプのフィールドと見なしますが、おそらくほとんど整数を含みます。おそらくそれは、主に米国でビジネスを行っている会社の郵便番号であるが、カナダの顧客は少数です。ユーザーが整数アフィニティを指定できるようにすると、すべての行で文字列を文字列にするよりも多くのスペースを節約できますが、それでもそのオプションは提供されます。


3
文字列"TOO MUCH"を数値列に正常に格納することについての質問の更新を書きました。自動変換ではゼロが挿入されます。また、これが私が知っている最初のリレーショナルデータベースの実装です。MSSQLServer、Oracle、PostgreSQL、MySQL、MS Acces、DBase、Foxbase、COBOL、Sybase SQL Anywhereを使用してきました。
TulainsCórdova2015

2
コメントが理解できません。私の答えについては、自動変換とは何の関係もありませんでした。
カールビーレフェルト

1
SQLiteは、データ型ではなくストレージクラスと見なします。sqlite.org/datatype3.html
JeffO

1
明確に書かれていることに賛成ですが、データの正確さを証明する際にこれが引き起こす問題無視しています DBからいくつかの整数を引き出して、それらが整数であると仮定することはできません。(「動的型付けが」乱暴と対立し、実際のリレーショナルモデルそのもの。)
ワイルドカード

1
タイピングを完全に無視するコストは、わずかなストレージスペースとプロセッサ時間よりもはるかに高くなります。
DeadMG 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.