Ich habe eine Tabelle, die eine ID
Schlüsselspalte mit binary(16)
zum Speichern einer GUID/UUID hat, der Rest der Spalten sind varchar(45)
.Warum funktioniert der Vergleich falsch eine gespeicherte Prozedur/Funktion?
Ich habe eine Funktion geschrieben, die eine Auswahl für ID
in den anderen Spalten ausgeführt, und wenn ID
nicht gefunden wird, dann erstellt eine neue. Mein Problem ist, dass diese Funktion eine ID
zurückgibt, die nicht mit meinen Daten übereinstimmt. Wenn ich nur den Select-Teil der Funktion auf der Workbench ausführe, wird nichts erwartet zurückgegeben.
Hier ist meine Funktion:
CREATE DEFINER=`sa`@`192.100.100.%` FUNCTION `SelectReadingHeaders`(testType VARCHAR(45)
, COL1 VARCHAR(45)
, COL2 VARCHAR(45)
, COL3 VARCHAR(45)
, COL4 VARCHAR(45)
, COL5 VARCHAR(45)
, COL6 VARCHAR(45)
, COL7 VARCHAR(45)
, COL8 VARCHAR(45)
, COL9 VARCHAR(45)
, COL10 VARCHAR(45)
, COL11 VARCHAR(45)
, COL12 VARCHAR(45)
, COL13 VARCHAR(45)
, COL14 VARCHAR(45)
, COL15 VARCHAR(45)
, COL16 VARCHAR(45)) RETURNS binary(16)
BEGIN
DECLARE columnID BINARY(16);
SELECT `ID` FROM `ate`.`readings_columns`
WHERE (`TYPE` <=> testType
AND`COL1` <=> COL1
AND `COL2` <=> COL2
AND `COL3` <=> COL3
AND `COL4` <=> COL4
AND `COL5` <=> COL5
AND `COL6` <=> COL6
AND `COL7` <=> COL7
AND `COL8` <=> COL8
AND `COL9` <=> COL9
AND `COL10` <=> COL10
AND `COL11` <=> COL11
AND `COL12` <=> COL12
AND `COL13` <=> COL13
AND `COL14` <=> COL14
AND `COL15` <=> COL15
AND `COL16` <=> COL16)
LIMIT 1
INTO columnID;
IF columnID IS null THEN
SET columnID = GuidToBinary(UUID());
INSERT INTO `ate`.`readings_columns`
VALUES (columnID
, testType
, COL1
, COL2
, COL3
, COL4
, COL5
, COL6
, COL7
, COL8
, COL9
, COL10
, COL11
, COL12
, COL13
, COL14
, COL15
, COL16);
END IF;
RETURN columnID;
END
Der nächste Block ist mein Testanruf, die ein falsches Ergebnis zurückgibt. Diese Gruppe von Spalten/Testtyp existiert nicht in der Tabelle. Der zurückgegebene Wert stammt aus einer Zeile mit einer übereinstimmenden Spalte TYPE
sowie einigen Nullspalten am Ende, ist jedoch keine vollständige Übereinstimmung. ToGuid ist eine Funktion, die binären macht (16) guid Menschen lesbare .:
SELECT ToGuid(SelectReadingHeaders('TCXOHunt','TEMPERATURE','ADC Ratio','AH0','AH1','AH2','BH0','BH1','BH2','INTERNALTEMPERATURE',null,null,null,null,null,null,null))
Und doch, wenn ich die Auswahlfunktion in eine neue Abfrage Registerkarte Typen gibt es 0 Ergebnisse wie erwartet:
SELECT ToGuid(`ID`) FROM `ate`.`readings_columns`
WHERE `TYPE` <=> 'TCXOHunt'
AND`COL1` <=> 'TEMPERATURE'
AND `COL2` <=> 'ADC Ratio'
AND `COL3` <=> 'AH0'
AND `COL4` <=> 'AH1'
AND `COL5` <=> 'AH2'
AND `COL6` <=> 'BH0'
AND `COL7` <=> 'BH1'
AND `COL8` <=> 'BH2'
AND `COL9` <=> 'INTERNALTEMPERATURE'
AND `COL10` <=> null
AND `COL11` <=> null
AND `COL12` <=> null
AND `COL13` <=> null
AND `COL14` <=> null
AND `COL15` <=> null
AND `COL16` <=> null
LIMIT 1
Benennen Sie Variablen oder Parameter niemals so wie die Spalten, mit denen Sie sie vergleichen möchten. – fancyPants
@fancyPants Das sollte eine Antwort sein, weil es mein Problem war. – Fr33dan