Seite wählen

NETWAYS Blog

Nachgestellte Leerzeichen und String-Vergleiche in Datenbanken

Für Datenbanken die sich an den SQL-92-Standard halten, gilt für Vergleiche von character strings nach Abschnitt 8.2 Generals Rules #3, dass die zu vergleichenden Strings, vor dem Vergleich auf die selbe Länge gebracht werden müssen. Der eventuell kürzere String wird demnach nach rechts auf die Länge des zu vergleichenden Strings mit Hilfe eines pad character, meist dem Leerzeichen, aufgefüllt.
Unter character strings fallen die Typen char (character) und varchar (character varying). Diese Typen ähneln einander, werden aber auf unterschiedliche Weise gespeichert und abgerufen.
char-Werte werden beim Speichern nach rechts mit Leerzeichen bis auf die deklarierte Länge aufgefüllt, welche beim Abrufen aber wieder entfernt werden. Bei char-Werten mit einer maximalen Anzahl von vier Zeichen beispielweise, kann man deshalb nicht zwischen 'abc' und 'abc ' unterscheiden.
Im Gegensatz dazu werden varchar-Werte nur mit so vielen Zeichen wie erforderlich zuzüglich der Information über die Länge gespeichert. varchar-Werte werden beim Speichern nicht aufgefüllt. Somit werden auch Leerzeichen beim Speichern und Abrufen beibehalten.
Und jetzt? Jetzt wollen wir versuchen aus den varchar-Werten 'abc' und 'abc ' nur 'abc ' zu selektieren.
Als Erstes brauchen wir natürlich eine Datenbank mit den gewünschten Daten (hier in MySQL):

CREATE DATABASE playground;
USE playground;
CREATE TABLE pad (string varchar(5));
INSERT INTO pad VALUES('abc');
INSERT INTO pad VALUES('abc ');
INSERT INTO pad VALUES('abc  ');

Als Nächstes überprüfen wir, ob – wie im Standard definiert – bei varchar-Werten Leerzeichen beim Speichern und Abrufen beibehalten werden:

SET sql_mode = PIPES_AS_CONCAT;
SELECT '"' || string || '"', LENGTH(string) FROM pad;
+----------------------+----------------+
| '"' || string || '"' | LENGTH(string) |
+----------------------+----------------+
| "abc"                |              3 |
| "abc "               |              4 |
| "abc  "              |              5 |
+----------------------+----------------+

Das sieht doch gut aus. Nun zurück zur eigentlichen Aufgabe: Wir wollen aus diesen Daten nur 'abc ' selektieren:

SELECT '"' || string || '"', LENGTH(string) FROM pad WHERE string = 'abc ';
+----------------------+----------------+
| '"' || string || '"' | LENGTH(string) |
+----------------------+----------------+
| "abc"                |              3 |
| "abc "               |              4 |
| "abc  "              |              5 |
+----------------------+----------------+

Irgendwie nicht richtig. Oder doch? Wie eingangs erwähnt, tritt hier die Regel für Vergleiche von character strings aus dem SQL-92-Standard in Kraft: Der kürzere zu vergleichende String wird nach rechts mit Leerzeichen aufgefüllt. Wenn 'abc' mit 'abc ' verglichen wird, wird eigentlich 'abc ' mit 'abc ' verglichen, oder 'abc' mit 'abc' – wer weiß das schon so genau :).
Kommt man trotzdem auf das gewünschte Ergebnis? Klar, mit einem Zaubertrick:

SELECT '"' || string || '"', LENGTH(string) FROM pad WHERE BINARY string = 'abc ';
+----------------------+----------------+
| '"' || string || '"' | LENGTH(string) |
+----------------------+----------------+
| "abc "               |              4 |
+----------------------+----------------+

Gibt’s Ausnahmen? Ja! Bei PostgreSQL sind bei Vergleichen von varchar-Werten nachgestellte Leerzeichen signifikant.

Eric Lippmann
Eric Lippmann
CTO

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.

OSDC 2014: Der Countdown läuft – nur noch 43 Tage

Wer bin ich?
Wo komme ich her?
Wo gehe ich hin?
Und wohin geht die Reise für PostgreSQL?
Fragen über Fragen, denen sich Michael Renner teilweise in seinem Vortrag annimmt.

OSDC? Noch nie gehört…
Das ist aber schade und fast schon ein unentschuldbares Versäumnis!
Aber wir holen das nach:
Die Open Source Data Center Conference (kurz OSDC) ist unsere internationale Konferenz zum Thema Open Source Software in Rechenzentren und großen IT-Umgebungen. 2014 findet sie zum sechsten Mal statt und bietet mit dem Schwerpunktthema Agile Infrastructures ganz besonders erfahrenen Administratoren und Architekten ein Forum zum Austausch und die Gelegenheit zur Aneignung des aktuellsten Know-Hows für die tägliche Praxis. Diesmal treffen wir uns dafür in Berlin!
Workshops am Vortag der Konferenz und das im Anschluss an die Veranstaltung stattfindende Puppet Camp komplettieren dabei das Rundum-sorglos-Paket für Teilnehmer, die gar nicht genug Wissen in sich aufsaugen können.

Und das war die PGConf.DE 2013

PostgreSQL Elephant Kollege Lennart und ich haben letzte Woche einen Abstecher nach Oberhausen gemacht, um an der deutschsprachigen PostgreSQL Konferenz 2013 teil zu nehmen.
In über 20 Vorträgen gab es viele Neuigkeiten zu PostgreSQL, der Community und einigen Projekten für und mit PostgreSQL. Wie auch an unseren Konferenzen zu spüren wächst das internationale Interesse an deutschen Konferenzen immer mehr, und so gab es auch viele englischsprachige Vorträge.
Aus einigen Vorträgen war zu entnehmen dass viele viele Anwender an Performance-Problemen scheitern, die meist auf grundsätzliche Index-Probleme, fehlende Tuningeinstellungen oder sogar schlecht durchdachte Anwendungen zurückzuführen sind.
Einige Unternehmen waren anwesend und berichteten von Ihren positiven Erfahrungen bei, Einsatz von PostgreSQL und der Migration von anderen RDBMS.
Es ist immer wieder eine Freude viele bekannte Gesichter zu treffen und sich über den neuesten „IT Tratsch“ auszutauschen.
Wer uns auf einer Konferenz entdeckt, darf übrigens gerne Hallo sagen, wir beißen nicht! 😉 Wir haben auch Steckbrief-Bilder zum einprägen!
Hier noch ein paar Vortrags-Empfehlungen:

The PostgreSQL name and logo are trademarks of The PostgreSQL Community Association of Canada. (source)

PostgreSQL bulk inserts mit Python

Wer oft viele Daten in seine PostgreSQL Datenbank schreibt, dem möchte ich den COPY-Befehl ans Herz legen. Damit können Daten zwischen Dateien und Tabellen kopiert werden. Mit Psycopg2, „dem“ PostgreSQL-Datenbankadapter für Python, sieht das dann ungefähr so aus:

import psycopg2
from cStringIO import StringIO
from itertools import imap
rows = [
    # Wert Spalte A, Wert Spalte B
    [1, 1],
    [2, 2],
    [3, None]
    # ...
]
buff = StringIO()
for row in rows:
    # \t ist standardmäßig der Spaltentrenner und join erwartet string
    print >>buff, "\t".join(imap(str, row))
# Nicht vergessen ;)
buff.seek(0)
with psycopg2.connect('...') as conn:
    with conn.cursor() as cursor:
        # None als NULL senden
        cursor.copy_from(buff, 'Tabelle', null='None')

Dass das ganze echt schnell ist, muss mir an dieser Stelle einfach geglaubt werden ;-).

Eric Lippmann
Eric Lippmann
CTO

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.

Prague: Postgres Conference Europe 2012

Nach 22 Jahren war es für mich mal wieder an der Zeit die Goldene Stadt zu besuchen. Natürlich auch, wie damals zur Fortbildung. Wars 1990 noch zu Bildungszwecken von der Schule aus, so war diesmal die Postgres Conference der willkommene Anlass. Deshalb starte ich auch gleich mit den ersten drei Bildern von der Konferenz selbst, gefolgt von Bildern, die auf der Karlsbrücke entstanden sind. Davon ist auf zwei Bildern die Prager Burg mit dem bilddominierenden Veitsdom zu sehen, einmal bei Tageslicht und das zweite mal angestrahlt bei Nacht.


Die vorletzten Reihe beschäftigt sich dann mit neuerer deutscher Geschichte. Hier ist neben dem Zaun der Balkon der deutschen Botschaft zu sehen. Vom Balkon verkündete der damalige Außenminister Hans-Dietrich Genscher am 30. September den ca. 4000 in die Botschaft geflüchteten DDR-Bürgen, das ihre Ausreise in die Bundesrepublik genehmigt sei.  Die letzten drei Bilder sind dann eine Reise in meine Vergangenheit und erinnern mich an einen denkwürdigen Abend im U Flecu im Herbst 1990.

Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.