SQLite '+' - Präfix bei Integerzahl entfernt (Spaltentyp STRING)

  • Ich habe dieses komische Problem. Ich habe eine Spalte in einer SQLite-Datenbank als STRING definiert, aber wenn ich sie mit Ganzzahlen, denen ein + vorangestellt ist, verwende, werden sie automatisch in eine richtige Ganzzahl umgewandelt:

     sqlite> create table test (key STRING);
    sqlite> insert into test values ('+1'); 
    sqlite> insert into test values ("+2");
    sqlite> select * from test;
    1
    2
     

    Wie Sie sehen, wird das Zeichen + entfernt. Wenn ich dagegen die Zitate zweimal zitiere :

     sqlite> delete from test;
    sqlite> insert into test values ('"+3"');
    sqlite> insert into test values ("'+4'");
    "+3"
    '+4'
     

    ... es funktioniert wie erwartet, aber sie werden zitiert. Mein Hauptproblem ist, dass ich alle Zeichenfolgen "doppelt" in Anführungszeichen setzen muss, da ich nicht garantieren kann, dass eine Zeichenfolge als Ganzzahl für die Datenbank erscheint und daher mit manipuliert wird.

    Dies würde ich gerne wissen:

    • Warum verhält sich SQLite so (und möglicherweise andere Implementierungen)?
    • Kann ich etwas dagegen unternehmen? (Ohne doppelte Anführungszeichen?)

    Das Einfügen der Zeichenfolge '+test' funktioniert nur als Referenz :

     sqlite> delete from test;
    sqlite> insert into test values ('+t');
    sqlite> select * from test;
    +t
     

    (Antwort ohne Anführungszeichen - whiii!)

    22 November 2011
    dacwe
1 answer
  • Dies hängt mit der dynamischen Datentypisierung von SQLite zusammen. Insbesondere ist STRING kein gültiger Typ, daher wird von SQLite der Affinität NUMERIC zugewiesen. Um von dieser Seite aus zu zitieren:

    Beachten Sie, dass ein deklarierter Typ von "FLOATING POINT" INTEGER - Affinität und nicht ECHTE Affinität ergibt aufgrund des "INT" am Ende von "POINT". Und der deklarierte Typ von "STRING" hat eine Affinität zu NUMERIC und nicht zu TEXT.

    Sie möchten Ihre Spalte als TEXT und nicht als STRING deklarieren. Das wird das Problem beheben.

    22 November 2011
    derobert