Anmelden, um zu folgen  
Folger 0
kekskruemel

SQL/PHP: Zahl in Datenbank - Komma durch Punkt

4 Beiträge in diesem Thema

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());
 }
}

?>


Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Die derzeitigen Spalten sind varchar.

Ich habe keine Ahnung wie du das genau meinst und wie ich das am Besten umsetze.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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, ',', '.');

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstellen Sie einen Account oder melde Sie sich an um kommentieren zu können

You need to be a member in order to leave a comment

Create an account

Registrieren Sie einen neuen Account in unserer Community. Es ist einfach!


Register a new account

Anmelden

Haben Sie bereits einen Account? Dann melden Sie sich hier an.


Jetzt Anmelden
Anmelden, um zu folgen  
Folger 0