VARCHAR to FLOAT or INT

select format(concat('','3.5' * 1), 2); -- 3.50
select format(concat('','3,5' * 1), 2); -- 3.00

Benutzen INT:

-- multipliziert mit 1
-- kein leerer String
-- nicht der String '0'. Prüft man nicht '0' sondern 0, wird auf empty geprüft.
SELECT * FROM mydata where concat('',my_int_id * 1) <> my_int_id AND my_int_id <> '' AND my_int_id <> '0';
-- in UPDATE WHERE funktioniert das nicht
--- in UPDATE WHERE kann man auch REGEXP nutzen
SELECT * FROM mydata where TRIM(my_int_id) NOT REGEXP '^[0-9]+$' AND my_int_id <> '' AND my_int_id <> '0';

Benutzen FLOAT:

SELECT * FROM buydata where format(concat('',preis * 1), 2) <> preis AND preis <> '';

Das schlägt fehl wenn preis z.B. 3.0 ist.
oder

SELECT * FROM buydata where concat('',preis * 1) <> preis AND preis <> '';

Weiß man, dass nur das Komma (statt dem Punkt) das Problem ist, kann man mit LIKE ‚%,%‘ die Kommas umwandeln:

update buydata set preis = replace(preis, ',', '.') where preis like '%,%';

Oder mit Regex:

SELECT preis FROM buydata WHERE preis NOT REGEXP '^[0-9]+$';

Anschließend mit

ALTER TABLE `buydata` 
CHANGE COLUMN `preis` `preis` FLOAT NOT NULL DEFAULT 0 ;

aus den VARCHARs FLOATs machen.

Bei größeren Zahlen, wie z.B. Unixtime:

SELECT * FROM tablename where replace(replace(format(concat('',the_date), 0),',',''),'.','') <> the_date and the_date <> '';

Um ein DE Datum (01.01.1970) in einen Integer (Unixtime) zu verwandeln hilft folgende Funktion:

CREATE FUNCTION `func_deDatestringToUnixtime`(p_datestring TINYTEXT) RETURNS int(11)
BEGIN
declare day_string VARCHAR(2);
declare month_string VARCHAR(2);
declare year_string VARCHAR(4);
declare sql_date_string VARCHAR(10);
declare datetime_datetime DATETIME;
declare datetime_int int(11);

set day_string = SUBSTR(p_datestring, 1, 2);
set month_string = SUBSTR(p_datestring, 4, 2);
set year_string = SUBSTR(p_datestring, 7, 4);
set sql_date_string = CONCAT_WS('-',year_string,month_string,day_string);
set datetime_datetime = CONVERT(sql_date_string, DATETIME);
set datetime_int = UNIX_TIMESTAMP(datetime_datetime);
RETURN datetime_int;
END

Vorbereitende Queries

UPDATE tablename SET columnname = TRIM(columnname);

…kann helfen wenn folgendes scheinbar nicht funktioniert:

SELECT
	columnname,
	concat( '', columnname * 1 )
FROM
	tablename
where
	trim( concat( '', columnname * 1 ))<> columnname
	AND columnname <> ''
	AND columnname <> 0;