1113 Stimmen

MySQL: Zeilenumbrüche in MySQL

Tipp von Stefan Trost | Letztes Update am 14.04.2024 | Erstellt am 09.06.2012

Das Zeichen beziehungsweise die Escape-Sequenz für einen Zeilenumbruch in PHP, JavaScript und einigen anderen Programmiersprachen ist \n, das Zeichen für einen Carriage Return ist \r. Je nach System steht in diesen Programmiersprachen demnach \r\n oder nur \n für einen Zeilenumbruch, wobei manchmal auch nur das \n alleine implizit für \r\n und damit für einen vollständigen Zeilenumbruch unabhängig vom System steht.

Wie aber verhält es sich damit in MySQL? Wie können wir mit der Hilfe von SQL-Befehlen explizit mit Zeilenumbrüchen arbeiten, zum Beispiel um gezielt nach Texten mit einem Zeilenumbruch in einer Datenbank zu suchen, Texte über mehrere Zeilen zu ersetzen, Texte mit Zeilenumbrüchen in eine Tabelle zu schreiben oder um Zeilenumbrüche durch ein anderes Zeichen zu ersetzen oder zu löschen?

In diesem Artikel möchten wir diese Frage in den nächsten Abschnitten beantworten:

Grundlage: Die CHAR()-Funktion

MySQL kennt weder die Escape-Sequenz \r noch die Escape-Sequenz \n. Um einen Zeilenumbruch in MySQL anzugeben, können wir stattdessen mit der Funktion CHAR() arbeiten. CHAR() nimmt einen oder auch mehrere ANSI-Codes entgegen und liefert uns das entsprechende Zeichen zurück, für das der jeweilige ANSI-Code steht (beziehungsweise die Zeichenkette aus den einzelnen ANSI-Codes falls wir mehr als einen Codepoint übergeben haben). Der Code beziehungsweise Codepoint aus dem ANSI-Range für einen Line Feed lautet 10 (LF), der für einen Carriage Return 13 (CR).

Windows-Zeilenumbrüche

Demnach können wir zum Beispiel folgende MySQL-Query für Windows-Zeilenumbrüche (CR LF) formulieren:

UPDATE tabelle SET spalte = REPLACE(spalte, CHAR(13, 10), '');

Damit ersetzen wir alle Zeilenumbrüche der Art \r\n mit nichts - das heißt wir löschen in der Tabelle "tabelle" die Zeilenumbrüche aus dem Text der Spalte "spalte" vollständig.

Statt CHAR(13,10) können wir auch CHAR(13) + CHAR(10) schreiben, was das selbe bedeutet. Mit dem Plus erzeugen wir einen String bestehend aus dem Zeichen mit dem Code 13 und dem Code 10. Da CHAR() mehrere Parameter entgegen nehmen kann, bekommen wir mit CHAR(13, 10) dasselbe Ergebnis.

Unix-Zeilenumbrüche (Linux und macOS)

Analog lassen sich natürlich auch andere Typen von Zeilenumbrüchen ersetzen indem wir statt 13 und 10 die entsprechenden anderen Zeichencodes einsetzen. Also zum Beispiel Linux-, Unix- und macOS-Zeilenumbrüche, die nur aus dem einen Zeichen mit dem dezimalen Code 10 (LF) bestehen:

UPDATE tabelle SET spalte = REPLACE(spalte, CHAR(10), ' ');

Mit dieser UPDATE-Query ersetzen wir alle Vorkommnisse dieses Zeilenumbruchtyps in der Spalte "spalte" der Tabelle "tabelle" durch ein Leerzeichen.

Zeilenumbrüche innerhalb eines Strings

Bisher haben wir die CHAR()-Funktion immer nur alleine und nicht in Verbindung mit anderen Zeichen genutzt. Im nächsten Beispiel möchten wir uns daher ansehen, wie wir nach einem Text bestehend aus mehreren Zeichen inklusive einem Zeilenumbruch zum Beispiel in einer Spalte des Typs VARCHAR oder TEXT mit MySQL suchen können:

SELECT id FROM tabelle WHERE spalte = 'Zeile 1' + CHAR(13) + CHAR(10) + 'Zeile 2';

Diese Anfrage sucht für uns alle Einträge aus der Tabelle "tabelle", die den zweizeiligen Text mit der ersten Zeile "Zeile 1" sowie der zweiten Zeile "Zeile 2" in der Spalte "spalte" enthält. Für das Beispiel haben wir einen Windows-Zeilenumbruch verwendet. Für einen Unix-Zeilenumbruch müssten wir entsprechend das "CHAR(13)" weglassen und stattdessen nur "'Zeile 1' + CHAR(10) + 'Zeile 2'" schreiben.

Nutzung der CONCAT()-Funktion

Alternativ zur Nutzung der Zusammensetzung unseres Strings über das Plus-Zeichen, wie wir es im Beispiel aus dem letzten Abschnitt gesehen haben, können wir für den gleichen Zweck auch die CONCAT()-Funktion von MySQL nutzen, der wir eine beliebige Anzahl von Parametern in Form von Einzelstrings übergeben können. Diese einzelnen Strings können sowohl aus in Anführungszeichen gesetzten Text als auch aus einzelnen durch CHAR() erzeugten Zeichen bestehen.

Das Beispiel aus dem letzten Abschnitt können wir auf die folgende Weise mit CONCAT() umsetzen:

SELECT id FROM tabelle WHERE spalte = CONCAT('Zeile 1', CHAR(13), CHAR(10), 'Zeile 2');

Die Einzelteile können wir demnach einfach mit einem Komma voneinander trennen.

Alternative Schreibweise der Zeichencodes

In allen bisherigen Beispielen haben wir die CHAR()-Funktion immer mit dezimalen Zeichencodes unserer Zeilenumbruchzeichen genutzt. Also 13 für CR sowie 10 für LF. MySQL erlaubt es uns jedoch auch, diese Codepoints in hexadezimaler Schreibweise anzugeben. Die hexadezimale Schreibweise für 13 ist 0D und für 10 ist die hexadezimale Schreibweise 0A. Um MySQL zu signalisieren, dass es sich bei unserer Angabe um eine hexadezimale Zahl handelt, müssen wir zusätzlich 0x voranstellen. Schauen wir uns dazu ein Beispiel an:

UPDATE tabelle SET spalte = 'a' + CHAR(0x0D) + CHAR(0x0A) + 'b';

Mit diesem SQL-Befehl setzen wir den Inhalt der Spalte "spalte" auf einen zweizeiligen Text, der aus den Zeilen "a" und "b" besteht. Für den Windows-Zeilenumbruch zwischen den beiden Zeilen nutzen wir statt CHAR(13) und CHAR(10) die hexadezimale Schreibweise CHAR(0x0D) sowie CHAR(0x0A).

Die Spezifikation des Windows-Zeilenumbruchs lässt sich vereinfachen, indem wir die einzelnen Zeichen 0D und 0A auf die folgende Weise zu 0x0D0A zusammenziehen und damit nur noch einmal die CHAR()-Funktion aufrufen müssen:

UPDATE tabelle SET spalte = 'a' + CHAR(0x0D0A) + 'b';

Bei der Verwendung der hexadezimalen Schreibweise können wir das CHAR() sogar ganz weglassen, wie das nächste Beispiel zeigt:

UPDATE tabelle SET spalte = 'a' + 0x0D0A + 'b';

Natürlich funktioniert es auch genauso mit unserer bereits vorgestellten CONCAT()-Funktion:

UPDATE tabelle SET spalte = CONCAT('a', 0x0D0A, 'b');

Jeder dieser vier verschiedenen Beispielaufrufe erzeugt liefert uns exakt das gleiche Ergebnis.

Bei Verwendung der dezimalen Schreibweise wären die hier gezeigten Notationen nicht möglich. Einmal abgesehen davon, dass wir nicht "1310" schreiben können, da im Gegensatz zur hexadezimalen Notation für die dezimale Zahl "1310" unklar wäre, dass sich diese Angabe auf zwei Einzelzahlen bezieht, würde ein Aufruf von 'a' + 10 + 13 + 'b' zu einer Interpretation der beiden Zahlen als String führen und das Ergebnis wäre statt einem Zeilenumbruch der Text "a1013b".

Einschränkungen der CHAR()-Funktion

Wichtig: Wir können die hier genutzte CHAR()-Funktion wirklich nur für Codes aus dem ANSI-Range mit den Integer-Zahlen von 0 bis 255 nutzen. Beliebige Codepoints über 255 lassen sich mit der Funktion nicht in ihre Zeichenäquivalente verwandeln.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.