Datenbank String-Vergleich

Hallo,

es ist dasselbe leidige Thema. Ich hab mittlerweile begriffen, dass wohl SQLite nicht wirklich in der Lage ist UTF-8 Strings (z.b. russische Schriftzeichen/-abfolgen) zu vergleichen. Ich überprüfe derzeit erfolgreich via

"SELECT * FROM Nachnamen WHERE Nachname = " + Textfield1.Text

ob ein Nachname bereits in der Datenbank existiert. Falls ja, wird in der Namentabelle die Nachname-Spalte mit der RowID des existierenden Nachnamen verknüpft. Leider funktioniert dies aber nicht beispielsweise mit russischen Schriftzeichen. Der SQL LIKE-Befehl ist mir natürlich ein Begriff, nur kann der für mich nicht infrage kommen, das wenn ich z.B. den Namen Meier überprüfe und es aber Personen gibt, die Meiereien heißen, dieser Nachname ebenfalls gefunden wird. Der Benutzer soll aber gar nicht erst dazu kommen, wählen zu müssen, mit welchen Nachnamen die Spalte verknüpft wird. Gibt es wirklich keine Lösung, um den obigen Befehl auch UTF-8-fähig zu machen?

LG

was geht nicht genau?

Man könnte zum Vergleichen einen Suchnamen in einer Spalte speichern mit lowercase zum Beispiel.
Wenn man dann mit lowercase vom Suchstring sucht, würde er das finden, egal wie Groß/Kleinschreibung eingestellt ist.

Die Funktion RemoveAccentsMBS vom MBS Plugin entfernt Accents und ersetzt sie durch die normalen Zeichen. Also wird e und wird a. Sowas hilft auch zum Vergleich.

Ein Beispiel:

Der Nachnamen von “Peter Tchaikovsky” wird bei erneuter Eingabe gefunden. In der Tabelle existiert auch dessen Nachname in russischer Schreibweise: “???”. Gebe ich diesen nun erneut ein und überprüfe dessen Existenz mit der oben erwähnten Abfrage, wird der Name nicht gefunden.
Da ich nicht weiß, welche Nachnamen der Benutzer, in welchem Schriftsystem, eingeben wird, ist eine Suchspalte nicht das Richtige. Zumal könnte ja auch jemand auf die Idee kommen, einfach mal einen Emoji als Nachname einzugeben. Dieses sollte bitte auch gefunden werden.

bist du sicher, dass das überhaupt funktioniert? Da fehlen da die Anführungszeichen. bzw. besser wäre ein Prepared Statement.

und hier mein Beispiel mit dem es geht:

[code] dim db as new SQLiteDatabase

if not db.Connect then
Break
end if

db.SQLExecute “CREATE TABLE test (test varchar)”
if db.Error then
Break
end if

dim r as new DatabaseRecord
r.Column(“test”) = “???”
db.InsertRecord(“test”, r)
if db.Error then
Break
end if

dim sql as string = “SELECT * FROM test WHERE test = ‘???’”
dim rr as RecordSet = db.SQLSelect(sql)

if rr.RecordCount <> 1 then
Break
else
// ok
Break
end if
[/code]

Ja, ich hatte hier im Post die Anführungszeichen vergessen. Komisch, mittlerweile funktioniert es anstandslos, obwohl ja selbst in der offiziellen SQLite-Doku steht, dass sich auf diese Art und Weise nur ASCII-Strings vergleichen lassen. Aber umso besser für mich.

Eine weitere Frage, wie speichere ich am besten den Inhalt einer umformatierten TextArea (StyledText = False) inklusive Zeilenumbrüchen in der Datenbank? Ich würde es auch als TEXT deklarieren oder ist da ein BLOB besser. Hab zwar mal gelesen, dass man das via StyledText.RTFData machen kann, aber ich mag ja wirklich nur den reinen Text, plus die EndOfLines dazu gespeichert haben. Zumal ich später diese mehrzeiligen Texte in eine Struktur exportieren muss, und da auch die Zeilenumbrüche auslesen muss und da erfolgt die Abfrage eben direkt aus der Datenbank und nicht über die TextArea, denn dort hätte man es ja via Split(TextArea, EndOfLine) erledigen können.

Danke Dir Christian!

für Text nimmt man TEXT. Da geht auch RTF rein.

Gruß
Christian

Tip: Für neue Fragen bitte einen neuen Thread aufmachen. Da finden dann auch andere die ähnliche Fragen haben die Lösung statt daß die Lösung in einem nicht-themenbezogenen Thread versteckt ist …