SQL/PHP: Zahl in Datenbank - Komma durch Punkt

kekskruemel

Angesehenes Mitglied
Hallo,

ich habe in einer Datenbank Zahlen derzeit mit Komma als Trennung drinstehen, also z.B. als Wert 51,8342
Nun sollen diese Werte bei insgesamt 19.000 Eintragungen ausgetauscht werden durch einen Punkt.

Wie kann ich das automatisieren? Gibt es eine gute SQL ANweisung dazu?

Ich habe es auch schon mit php probiert, aber da scheint ein Fehler im Code zu sein:
CODE

<?php
include ('define.php'); // DB Zugang
for($i=1; $i<19000; $i++)
{
$sql_plz = mysql_query("SELECT petrol_station_masters.id, petrol_station_masters.longitude AS longitude, petrol_station_masters.latitude AS latitude FROM petrol_station_masters WHERE petrol_station_masters.id = '".$i."' ") or die(mysql_error());
echo mysql_num_rows($sql_plz);
while( $ds3 = mysql_fetch_object($sql_plz) )
{
$latitude =$ds3->latitude;
$longitude = $ds3->longitude;
$latitude = str_replace(',', '.', $latitude);
$longitude = str_replace(',', '.', $longitude);

$update = mysql_query("UPDATE petrol_station_masters SET petrol_station_masters.longitude = '".$longitude."' AND petrol_station_masters.latitude = '".$latitude."' WHERE petrol_station_masters.id = "'.$ds3->petrol_station_masters.id.'" ") or die(mysql_error());
}
}

?>



 
So etwas würde ich nie so machen.

Abgesehen davon: Existiert das Problem überhaupt?

Was ist das in der Datenbank für ein Datentyp?

Wenn das ein numerischer ist, dann ist das bloß ein 'Scheinergebnis', das mit der Transformation auf die 'deutsche Darstellung' zusammenhängt.

Wenn tatsächlich Zahlen als String mit Komma definiert sind, dann:

Eine zweite Textspalte erstellen, da rein per Update die Kommas durch Punkte ersetzen.

Eine nummerische Spalte erstellen, da die zweite Textspalte reinkonvertieren.

Originalspalte umbenennen, letzte Spalte als Original benennen.

Das analog mit der zweiten Spalte.
 
Die derzeitigen Spalten sind varchar.

Ich habe keine Ahnung wie du das genau meinst und wie ich das am Besten umsetze.
 
Die SQL-Abfragen sollten besser erst getestet werden, da ich es nicht gemacht habe.


SQL UPDATE petrol_station_masters SET petrol_station_masters.longitude = REPLACE(petrol_station_masters.longitude, ',', '.') AND petrol_station_masters.latitude = REPLACE(petrol_station_masters.latitude, ',', '.');


Sobald Du nur noch Zahlen mit Punkt drin stehen hast, kannst Du wohl auch das Feld in ein Decimal, Float oder Double ändern, wäre zumindestens sehr sinnig Daten als das zu Speicher, was sie auch sind (und ich denke das meint teilweise auch Jürgen), ggf. musst Du aber diese Daten erst in eine neue Spalte kopieren, danach die alte Löschen und im Anschluss die neue umbenennen. Das vorherige Testen an einen Kopie der DB sollte natürlich selbstverständlich sein.
wink.gif



SQL UPDATE petrol_station_masters SET petrol_station_masters.longitude_new = REPLACE(petrol_station_masters.longitude, ',', '.') AND petrol_station_masters.latitude_new = REPLACE(petrol_station_masters.latitude, ',', '.');
 
QUOTE (kekskruemel @ Fr 13.05.2011, 17:43)Die derzeitigen Spalten sind varchar.

Das sind Zahlen, also sollten die auch als Zahlen abgespeichert werden.

Ich nutze für Geodaten üblicherweise

Decimal(18,14)

also Dezimalzahlen mit 4 Vorkomma und 14 Nachkommastellen.

Ansonsten muß man bei Berechnungen ständig erst die Textdarstellung in nummerische Daten umwandeln.


Aber so eine Typumwandlung würde ich nie direkt auf der Spalte machen. Sondern immer über Hilfsspalten gehen, welche die Zwischenwerte aufnehmen:


CODE
Update Tabelle Set Zwischenspalte = Replace(longitude, ',', '.')
Update Tabelle Set longitude_neu = Cast(Zwischenspalte as Decimal(18,14))



so als Pseudocode (ich weiß nicht genau, ob die Update-Anweisung bei mySql so ist).

Und dann die Spalten umbenennen:

longitude -> longitude_old
longitude_neu -> longitude


Solange man das über zusätzliche Spalten macht, kann man das auch immer auf der 'Originaltabelle' machen, man kann ja die Zusatzspalten wieder rauslöschen.
 
Zurück
Oben