<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kau-Boys blog &#187; Datenbank</title>
	<atom:link href="http://kau-boys.de/category/datenbank/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:09:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Suchen-und-Ersetzen mit MySQL-Datenbanken</title>
		<link>http://kau-boys.de/datenbank/suchen-und-ersetzen-mit-mysql-datenbanken?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=suchen-und-ersetzen-mit-mysql-datenbanken</link>
		<comments>http://kau-boys.de/datenbank/suchen-und-ersetzen-mit-mysql-datenbanken#comments</comments>
		<pubDate>Wed, 23 Dec 2009 00:39:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=549</guid>
		<description><![CDATA[Vor ein paar Tagen musste ich ca. 1000 Datens&#228;tze, die fehlerhaft in eine Datenbank geschrieben wurden &#252;berarbeiten. In einer Spalte, die Links enth&#228;lt musste die Toplevel-Domain von .de auf .com ge&#228;ndert werden. Bis zu diesem Zeitpunkt war ich der Meinung, dass es nicht m&#246;glich ist ein Suchen-und-Ersetzen auf MySQL-Tabellen mit einem einfachen SQL-Statement durchzuf&#252;hren. In [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen musste ich ca. 1000 Datens&#228;tze, die fehlerhaft in eine Datenbank geschrieben wurden &#252;berarbeiten. In einer Spalte, die Links enth&#228;lt musste die Toplevel-Domain von .de auf .com ge&#228;ndert werden. Bis zu diesem Zeitpunkt war ich der Meinung, dass es nicht m&#246;glich ist ein Suchen-und-Ersetzen auf MySQL-Tabellen mit einem einfachen SQL-Statement durchzuf&#252;hren. In der Regel habe ich daher die Tabelle mit einem Programm wie Access verbunden und dort die Suchen-und-Ersetzen Funktion genutzt.</p>
<p>Die L&#246;sung f&#252;r das Problem war allerdings recht simpel. Ich habe f&#252;r Abfragen schon mehrfach die <a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_replace">REPLACE() Funktion</a> von MySQL benutzt, die wie folgt definiert ist:</p>
<p><span id="more-549"></span></p>
<pre class="brush: sql; gutter: false;">
REPLACE(str,from_str,to_str)
</pre>
<p>Bisher habe ich aber die Funktion lediglich in einer Abfrage einsetzt, um direkt in einer Abfrage bestimmte Umformungen durchzuf&#252;hren, um z.B. nach den ge&#228;nderten W&#246;rtern gruppieren oder sortieren zu k&#246;nnen. Die REPLACE Funktion, die es auch schon in MySQL 4.1 gab, kann einem aber auch dabei helfen die Texte einer Spalte zu aktualisieren. Die Syntax f&#252;r eine Suchen-und-Ersetzen-Abfrage sieht wie folgt aus:</p>
<pre class="brush: sql; gutter: false;">
UPDATE [Tabellenname] SET [Spaltenname] = REPLACE([Spaltenname], [Suchwort], [Ersetzung])
</pre>
<p>Hierbei muss wie von vielen Programmen gew&#246;hnt nicht das gesamte Wort ersetzen werden. Wenn in einer Spalte das Suchwort meh als einmal gefunden wird, wird es auch mehrfach ersetzt. Zus&#228;tzlich kann in dem Update Statement nat&#252;rlich auch ein WHERE Statement eingebaut werden, um nicht alle Eintr&#228;ge einer Tabelle zu aktualisieren. Nehmen wir also an, es gibt eine Tabelle blogroll mit Links. In dieser wollen wir alle Links von .com auf .de &#228;ndern, aber keine Links, die auf example.com zeigen. Das Statement hierf&#252;r sieht dann wie folgt aus:</p>
<pre class="brush: sql; gutter: false;">
UPDATE blogroll SET link = REPLACE(link, '.com', '.de') WHERE link NOT LIKE '%example.com%'
</pre>
<p>Ihr k&#246;nnt somit sehr einfach in einer Tabelle Werte durch andere ersetzen. Ihr k&#246;nnt hierbei als Ersetzung auch weitere Funktionen nutzen wir z.B. die <a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_concat">CONCAT() Funktion</a> mit der sich Texte oder Spalten zusammensetzen lassen.</p>
<p>Aber ihr m&#252;sst wie immer sehr vorsichtig mit UPDATE Statements umgehen, denn ein STRG + Z zum R&#252;ckg&#228;ngigmachen der Aktion gibt es nicht. Solltet ihr also nicht sicher sein, ob das Statement korrekt ist, gebt das Ergebnis der umformung zuerst mit einem SELECT Statement aus:</p>
<pre class="brush: sql; gutter: false;">
SELECT link, REPLACE(link, '.com', '.de') AS new_link FROM blogroll WHERE link NOT LIKE '%example.com%'
</pre>
<p>Am sichersten ist es nat&#252;rlich, wenn ihr die Daten der Tabelle vorher in einem SQL-Dump speichert. Ich hoffe dass der Tipp euch dabei helfen wird, wenn ihr mal ein &#228;hnliches Problem habt. Ich war ja bisher der Meinung, dass ich solche Ersetzungen immer nur auf einem Dump der Daten in einem Texteditor schnell durchf&#252;hren kann, aber nun werde ich diesen Trick vermutlich h&#228;ufiger einsetzen. </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/datenbank/suchen-und-ersetzen-mit-mysql-datenbanken/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
