PostgreSQL case sensitive / case insensitive

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Hallo Community,

leider weis ich nicht mehr weiter nach langer Google suche.
Also ich habe folgendes Problem:
Ich möchte ganz gerne eine Webseite mit Django machen und als DBMS PostgreSQL.
Bis jetzt hat auch alles wunderbar funktioniert bis mir heute aufgefallen ist, dass PostgreSQL case sensitive ist.
Ich wollte mal fragen wie ihr das gelöst habt, das z.B.

SELECT * FROM test WHERE username = 'Test';
und
SELECT * FROM test WHERE username = 'tEsT';

dasselbe Ergebnis bringt?!
Django Syntax:

test.objects.get(username = 'Test')
oder
test.objects.get(username = 'tEsT')

Ich habe gelesen das es bei PostgreSQL mit "collation" gehen soll.
Aber leider ist mir die Syntax nach CREATE table nicht klar!

Also wo soll collation hin und welcher Befehl schaltet case sensitive aus / ein?!

Hoffe ihr könnt mir weiterhelfen :)

Lg
Berliner
Benutzeravatar
sehbaer
User
Beiträge: 39
Registriert: Sonntag 30. März 2008, 17:26
Wohnort: Kölle

Code: Alles auswählen

SELECT * FROM test WHERE lower(username) = lower('tEsT');
sollte es schon erledigen.
...es sind ganz bestimmt mehr Nullen als Einsen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@OP: Wieso sollte man so etwas wollen?

Generell würde ich sagen, dass ich das wenn schon intern lösen würde. Wenn Du innerhalbd Deines Python Codes Objekte nicht case sensitive behandeln willst, dann konvertiere sie so früh wie möglich nach einer User-Eingabe in Kleinbuchstaben o.ä.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

BerlinerMC hat geschrieben:Bis jetzt hat auch alles wunderbar funktioniert bis mir heute aufgefallen ist, dass PostgreSQL case sensitive ist.
Das ist nicht PostgreSQL-spezifisch, sondern der Normalfall bei allen Datenbanken. Siehe http://docs.djangoproject.com/en/dev/re ... ts/#iexact für eine Django-spezifische Lösung.

Stefan
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

sehbaer hat geschrieben:

Code: Alles auswählen

SELECT * FROM test WHERE lower(username) = lower('tEsT');
sollte es schon erledigen.
Das geht zwar so in der psotgreSQL Konsole so, aber nicht Django spezifisch!
Hyperion hat geschrieben: @OP: Wieso sollte man so etwas wollen?
Es gibt User die ihren Namen irgendwie immer anders schreiben und wenn sie sich einloggen in ein System dann auch wieder anders.
Du kannst hier in dem Forum dich einloggen mit Hyperion, hyperion oder wie auch immer, deine Daten werden immer gefunden.
Oder wenn ich eine Suche eingebe und ein exaktes Ergebnis haben möchte, dann sollte das System nicht auf Groß / Kleinschreibung achten
sma hat geschrieben: Das ist nicht PostgreSQL-spezifisch, sondern der Normalfall bei allen Datenbanken. Siehe http://docs.djangoproject.com/en/dev/re ... ts/#iexact für eine Django-spezifische Lösung.
Bei MySQL ist es nicht so! Mit dem DBMS habe ich vorher gearbeitet.
Aber danke für den Link, das werde ich dann so machen :)

Hatte nur gehofft, das es bei postgreSQL irgendwo eine Einstellung gibt wo man case sensitive ein / abschalten kann. Jedoch habe ich das im Internet nicht gefunden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BerlinerMC hat geschrieben: Es gibt User die ihren Namen irgendwie immer anders schreiben und wenn sie sich einloggen in ein System dann auch wieder anders.
Du kannst hier in dem Forum dich einloggen mit Hyperion, hyperion oder wie auch immer, deine Daten werden immer gefunden.
Oder wenn ich eine Suche eingebe und ein exaktes Ergebnis haben möchte, dann sollte das System nicht auf Groß / Kleinschreibung achten
Ok, aber das kannst Du ja generell so lösen, dass Du diese Eingabe explizit in Kleinbuchstaben wandelst und erst dann mit der DB abgleichst.

Generell halte ich es für sinnvoll, dass eine DB da case-sensitiv agiert - das andere Verhalten kann man ja eben leicht simulieren, was andersherum sicherlich schwieriger wäre ;-)
Antworten