sql >> データベース >  >> RDS >> SQLite

SQLiteの列タイプはどの程度柔軟/制限的ですか?

    SQLiteの列タイプは柔軟(動的)であり、主に、他のデータベース管理システムで使用される固定列タイプの採用/適応に対応しているようです。

    注意!このAsnwerは、奇妙で素晴らしい列タイプの使用を推奨していません。

    1) 実際には、列タイプには事実上すべての名前を使用できますが、いくつかの制限があります。

    2) 列タイプは、列定義の2番目の値です。例: CREATE TABLE table (columnname columntype .....,....) 、意図的にまたはおそらく不注意に省略される場合がありますが、 5a)を参照してください。

    3) 最初の制限は、mycolumn INTEGER PRIMARY KEY またはmycolumn INTEGER PRIMARY KEY AUTOINCREMENT 特殊な列タイプです。この列は、 rowidのエイリアスです。 これは一意の数値識別子です( AUTOINCREMENT 乱暴なというルールを課します テーブルに最後に使用されたROWIDよりも大きくする必要があります。行がID(9223372036854775807)を使用している場合、それ以降に行を追加しようとすると、SQLITEFULLエラーが発生します。 )。 SQLite自動インクリメント

    4) その他の制限は、列タイプがSQLiteパーサーを混同してはならないことです。たとえば、列タイプがPRIMARY、TABLE、INDEXの場合、SQLite例外が発生します(構文エラー(コード1) )例: INDEXの列タイプが使用される場合:-

    android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):
    

    発生します。

    5) 列タイプは必須ではありません。たとえば、CREATE TABLE mytable (...,PRIMARY_COL,.... この場合、 PRAGMA TABLE_INFO(tablename) タイプは表示されません。例: (3行目)。

    08-08 07:56:23.391 13097-13097/? D/TBL_INFO: Col=cid Value=8
    08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=name Value=PRIMARY_COL
    08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=type Value=
    08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=notnull Value=1
    08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=dflt_value Value=null
    08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=pk Value=0
    

    5a) 場合によっては、SQLiteパーサーは有効なキーワードにスキップします。 CREATE TABLE mytable (mycolumn NOT NULL,... 結果はNOT NULL NOT NULLを示すために使用されています 列とタイプ タイプなしと見なされます (上記のtable_infoは、実際にはそのような使用法からのものです。)

    6) タイプは単一の単語に限定されません。 VARYING CHARACTER(255) またはTHE BIG BAD WOLF このtable_info抽出からわかるように、タイプとして指定できます:-

    08-08 08:23:26.423 4799-4799/? D/   TBLINFO: Col=type Value=THE BIG BAD WOLF
    

    SQLiteで非標準の列タイプを使用する理由!

    要するに、いいえはありません 理由は、最初に述べたように、列タイプの柔軟性は、主に他のデータベース管理システムからのSQLの容易な適応に対応するためであるように思われます。

    SQLiteが使用するストレージクラスとして決定した内容に従ってデータが保存されるため、列タイプ自体はほとんど効果がありません。 rowidを除いて ( 3を参照) 上記)任意の列は、任意のタイプの値を保持できます。

    cursor.getBlobを使用して取得する必要があるBlobとして保存されたデータを除きます。 そして、そのcursor.getBlobは、BLOBとして保存されていないデータには使用できません(getBlobは、TEXTとして保存されているデータで失敗しません)。cursor.get???? メソッド。

    次にいくつかの例を示します。-

    データがlong myINT = 556677888;である列の場合 追加されます(ContentValuesを介して例:cv1.put(columnanme,myINT) );

    次に:-

    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=INTEGER_COL<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>556677888<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>556677888<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>556677888<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>5.56677888E8<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>5.566779E8<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>15104<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.
    

    getShortは保存された値に戻りません、getBlobは保存された値を取得できません。

    Double myREAL = 213456789.4528791134567890109643534276;の場合 :-

    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
    08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.
    

    String myTEXT = "The Lazy Quick Brown Fox Jumped Over the Fence or something like that.";

    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=TEXT_COL<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>0<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>0<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>The Lazy Quick Brown Fox Jumped Over the Fence or something like that.<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>0.0<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>0.0<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>0<<
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS BLOB >>[[email protected]<<
    

    これは、列タイプがmy_char_is_not_a_char_but_an_intの非常にばかげた例です。 PRAGMA TABLE_INFOによる :-

    08-08 09:19:03.657 13575-13575/mjt.soqanda D/TBL_INFO: Col=cid Value=7
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=name Value=my_char_is_not_a_char_but_an_int_COL
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=type Value=my_char_is_not_a_char_but_an_int
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=notnull Value=0
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=dflt_value Value=null
    08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=pk Value=0
    

    結果(上記の「Double」に従って保存)は次のとおりです。-

    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Column=my_char_is_not_a_char_but_an_int_COL<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
    08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.
    

    上記は以下に基づいています。-SQLiteバージョン3のデータ型SQLite自動インクリメントPRAGMAステートメント

    コードは、最小バージョン14およびターゲット26でコンパイルされたAPI22を実行するGenyMotionエミュレートデバイスでテスト/実行されました。




    1. SQLiteの列タイプはどの程度柔軟/制限的ですか?

    2. Room Migration Alter Tableは新しい列を追加せず、移行は何度も呼び出されます

    3. 生成された列をSQLiteのテーブルに追加する

    4. SQLServer2017のデータ型のリスト