MySQL Problem Binary-Data

tecilein

Lt. Commander
Registriert
Mai 2006
Beiträge
1.278
Nachtrag:
Sorry @ Admins, hatte vergessen [MYSQL] vor den Thread zu machen.


Hi,

Der Import von CSV-Daten in ein BIT-Field macht Probleme, deshalb habe ich das BIT-Field auf VARCHAR(8) umgestellt.

Der Import klappt dann auch und es steht z.B. "00001000" drin.
Das Problem ist aber, dass das ganze als 1000 interpretiert wird und nicht als 8 (Binär zu Dezimal).

Gibt es eine Möglichkeit mit MYSQL einen String / Feldinhalt als Binärcode zu interpretieren.
Also das die 00001000 bei CONVERT(feldname, DECIMAL) in 8 gewandelt wird?

Im aktuellen Fall passiert nämlich gar nichts, da die 00001000 in 1000 gewandelt wird :(



Für mich gibt es jetzt zwei Lösungsmögllickeiten.
Entweder einen SQL-Befehl finden, der das Problem löst,
oder für den CSV-Import ein eigenes Script zu schreiben,
das es mir ermöglicht den Binärcode in BIT-Fields zu schreiben, statt in VARCHAR-Fields.


Vielleicht hat jemand von euch eine Idee.
Grund der Spielerei ist, dass ich z.B. folgendes machen möchte:

Werte:
10001000
11000000

Abfrageschlüssel:
10000000

Rauswerfen soll er mir dann (via | (OR) binärvergleich):
10001000
11000000


Beim Abfrageschlüssel:
01000000

Soll aber nur kommen:
11000000



In meinem eigenen Testszenario, ohne CSV Import und mit BIT-Fields, geht das ganze auch, z.B. mit folgendem Befehl:
Code:
SELECT id FROM test WHERE CONVERT(matchcode1, DECIMAL) | 8 = 8 LIMIT 1

Die 8 wird in dem Fall vom PHP Script geliefert durch bindec("00001000");

matchcode1 ist das BIT-Field in der Datenbank.
00001000 respektive 8 ist der Abfrageschlüssel.



Das Ganze ist etwas kompliziert zu beschreiben ;)
Sollten Fragen bestehen, ich erläutere bestimmte Aspekte gerne genauer.


MfG,
tec
 
Zuletzt bearbeitet:
Code:
CREATE FUNCTION DEC_TO_BIN (@eingabeDez int)
RETURNS varchar(200)
as
BEGIN
 
	DECLARE @BinZahl VARCHAR(200)
	SET @BinZahl = ''
 
	WHILE @eingabeDez <> 0
	BEGIN
		SET @BinZahl = SUBSTRING('0123456789', (@eingabeDez % 2) + 1, 1) + @BinZahl
		SET @eingabeDez = @eingabeDez / 2
	END
 
	RETURN @BinZahl
 
END

Code:
SELECT dbo.DEC_TO_BIN()
 
Zuletzt bearbeitet:
Hi,

Danke dafür, ich bekomme es aber leider nicht zum laufen.

Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax
to use near '@eingabeDez int) RETURNS varchar(200) as BEGIN DECLARE @BinZahl VARCHAR(' at line 1

In die SQL-Zeile reinkopieren müsste ja eigentlich laufen / gespeichert werden.
Ich hab auch die genaue Datenbank im CREATE FUNCTION angegeben:
Code:
CREATE FUNCTION test.DEC_TO_BIN (@eingabeDez int)


Ich kenne mich mit der Syntax beim erstellen von Functions leider nicht aus.
Hab das vorher noch nie gebraucht.


MfG,
tec
 
Zuletzt bearbeitet:
Oh, ich habe ganz übersehen, dass du ja MySQL benutzt, das hier ist für T-SQL geschrieben. Ich habe jetzt gerade keine Zeit mehr, werd's dir aber umschreiben, sobald ich dazu komme.
 
Also, erst mal werden Variablen wohl ohne @ geschrieben. Ich bin nicht wirklich vertraut mit MySQL, da ich wir hier nur Microsoft SQL Server rum stehen haben.

Code:
CREATE FUNCTION DEC_TO_BIN (eingabeDez int)
RETURNS varchar(200)
as
BEGIN
 
	DECLARE binZahl VARCHAR(200)
	SET binZahl = ''
 
	WHILE eingabeDez <> 0
	BEGIN
		SET binZahl = SUBSTRING('0123456789', (eingabeDez % 2) + 1, 1) + binZahl
		SET eingabeDez = eingabeDez / 2
	END
 
	RETURN binZahl
 
END

Probierl mal aus und poste die Fehlermeldungen. Kann hier leider nicht die MySQL Syntax checken.
 
Zuletzt bearbeitet:
Anfangs:
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as BEGIN DECLARE binZahl VARCHAR(200) SET binZahl = '' WHILE eingab' at line 3

Wenn ich das "as" entferne:
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET binZahl = '' WHILE eingabeDez <> 0 BEGIN SET binZahl = SUBSTRING('' at line 6


Gibt es irgendwo eine gute Beschreibung wie man MYSQL Funktionen schreibt?
Ich finde irgendwie nichts dazu.

Auf der offiziellen Seite ist das Ganze nicht ganz ersichtlich.


MfG,
tec
 
Zuletzt bearbeitet:
In mySQL brauchst du dafür gar keine Function. Geht mit folgendem Befehl:

Code:
CONV(HEX(nNumber),16,2)

liefert die Binärzahl von nNumber zurück. Kann auch ein Datenbankfeld sein.


Als Function:

Code:
DELIMITER $$
DROP FUNCTION IF EXISTS dec2bin $$
CREATE FUNCTION dec2bin (nNumber bigint)
RETURNS varchar(64)
DETERMINISTIC
BEGIN

     RETURN CONV(HEX(nNumber),16,2);

END $$
DELIMITER ;


höchst möglichste Zahl müsste 9223372036854775808 sein

oder auch so, wenn CONV und HEX nicht zur Verfügung stehen:

Code:
DELIMITER $$
DROP FUNCTION IF EXISTS dec2bin $$
CREATE FUNCTION dec2bin (a bigint)
RETURNS varchar(64)
DETERMINISTIC
BEGIN
        DECLARE sResult varchar(64) DEFAULT "";
        DECLARE b int DEFAULT 0;

        WHILE a >= 1 do

            SET b = MOD (a,2);
            SET a = (a div 2);

            SET sResult=CONCAT(b, sResult);

        END WHILE;

        RETURN sResult;
END $$
DELIMITER ;


Oder als procedure wie sie wahrscheinlich Informix verstehen würde:

Code:
create procedure dec2bin (nNumber int)
returning varchar(32);

     define sResult varchar(32);
     define A int;
     define B int;
		
     let B = 0;
     let A = nNumber;
     let sResult = "";
    	
     WHILE A >= 1
    	
        	let B = MOD (A,2);
        	let A = (A / 2);
        	
        	IF B=0 THEN
        		let sResult="0" || sResult;
        	ELSE
        		let sResult="1" || sResult;
        	END IF;
        	
     END WHILE;
    
return sResult;
        
end procedure;


Such dir was aus - oder für Leute, die diesen Thread via google finden. So wie ich :)
 
Zurück
Oben