dedlfix: SELECT auf einzelne bytes in BINARY(N)

Beitrag lesen

Tach!

ich habe eine mySQL Tabelle mit einer Spalte "data" vom Typ BINARY(127) und würde jetzt gerne die Bytes 0-3 von den Zeilen selektieren, bei denen Byte 2 = 0x88 ist.
Wie macht man das?

SELECT

HEX(SUBSTR(data,1,1)),
HEX(SUBSTR(data,2,1)),
HEX(SUBSTR(data,3,1)),
HEX(SUBSTR(data,4,1))
FROM
raw
WHERE
HEX(SUBSTR(data,3,1)) = HEX(0x88)


>   
> Das tut zwar, aber sieht unschön aus und ist auch recht umständlich. Geht das eleganter?  
  
Nicht dass ich wüsste. In der SELECT-Klausel vielleicht, wenn du die Bytes nicht einzeln sondern am Stück zurückgibst und im abfragenden Programm auseinandernimmst.  
  

> Ausserdem ist ein Index auf der Spalte - wird der mit SUBSTR() noch korrekt genutzt?  
  
Sicher nicht. Ein Index ist eine sortierte Menge. Nur so kann man in ihr schnell etwas finden. Du hast garantiert nicht angegeben, dass der Index für Byte x angelegt werden soll, weil das syntaktisch gar nicht vorgesehen ist.  
  
EXPLAIN kann dir Fragen zum verwendeten Index genau beantworten. Bei zu wenig Daten in der Tabelle wird allerdings auch gern mal kein Index verwendet, weil das zusätzliche Lesen des Index sonst länger dauert als das direkte lesen der Daten. Das entscheidet der Optimizer von Fall zu Fall.  
  

> Wie sieht es aus, wenn ich die Bytes 0 und 1 zusammen gerne als 16 bit Integer selektieren wollen würde?  
  
MySQL hat im Handbuch eine Übersicht zu allen Funktionen. Wenn du da was passendes findest ...  
  
  
dedlfix.