2011-09-11 5 views
5

Prima di tutto ho una domanda molto concreta, ma forse un approccio alternativo al mio problema (seconda parte) potrebbe anche aiutarmi.Iterate su caratteri in stringa in mysql

C'è un modo per indirizzare un carattere in una stringa tramite il suo indice in mysql. (cioè in PHP $ var [2] ti darà il terzo charatter)?

Il modo ovvio è SUBSTRING(var, 3,1) ma poiché le mie stringhe sono lunghe 1024 caratteri, presumo che questa non sia la soluzione più veloce. Come visualizzato nel codice, l'esempio che utilizza la sottostringa per recuperare la coda della stringa non ottiene alcuna differenza di prestazioni. C'è forse un modo per scorrere su una stringa? (Spostare il primo elemento?)

CREATE FUNCTION hashDiff(hash1 TEXT(1024), hash2 TEXT(1024), threshold INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
    DECLARE diff, x, b1, b2 INT; 
    SET diff =0; 
    SET x = 0; 
    WHILE (x<1024 AND diff<threshold) DO 
     SET b1 = ASCII(hash1); --uses first character only!! 
     SET b2 = ASCII(hash2); 
     SET hash1=SUBSTRING(hash1, 2); 
     SET hash2=SUBSTRING(hash2, 2); 
     SET diff=diff+ ((b1-b2)*(b1-b2)); 
     SET x=x+1; 
    END WHILE; 
    RETURN diff; 
END 

Se non già letto dal codice, provo a scrivere una stored procedure per calcolare la differenza o distanza tra di hash. La differenza è la somma delle distanze quadrate carattere-saggio (ad esempio hashDiff(AA,AC)=(65-65)²+(65-67)²=4). Il primo importante incremento delle prestazioni potrebbe essere ottenuto introducendo una soglia per annullare il calcolo se gli hash sono già diversi. Ma dal momento che mysql non è la mia lingua "ogni giorno", mi sono fermato a questo punto nel trovare altre ottimizzazioni. Per completezza due campioni hash:

YAAAAAAYAAAYAAVAAQAARAOAAOAQASAQAMAKAKAJIAJAJIAHAHIAKJAIIAHHAHIIAIHGAGFFAGGFEAFEEEEAEDDDDDAEEEEDEEEFAFFFFFFEFFFEFFFFFGFEEFFEEEFFFJEFFEEEEEEELFFFFEEFJEEEEDIEEEEEIEEEEHEEEJEEFKFEFKGGFNHGOIIJTJKYONYNMTGHNHHQISJJQIKWLXJJSMYRQWJOGKDDFCCBBAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAYAAAYAAWAARAASASAAQARAUAYAYATAOALKAJAJIAIAHHAHGAGFAFFAEFFAEFFAFFFAEEFFAFEEEDADEDDDDADDDCDDDDDAEEEFEEEEDDDEEEDEDDEEEFEFFGGFMFHGFFFGFFFLGHGGHGGNHHGGGOHGHGHMGGFGMFFFMFGFLFFFMGFFMGGMGGGNGGMGGLGGLGGMGGLEIEEHDCGCGCDGDGDCGDFCECCECECECECFCECFCFCFCFCFCGCJGYCYAAAAAAYAAAYAAUAATAAUAUAAUARARAQAPAPASARRAPARQAPAQQAQQAQSAKMATKKAIIHAIHGAGGGGAGHHGGAGGFGFFAFFGEFFFFFAFFGFGGGFFFEEFGFFGGFGGHIJJLKLWLKJJIJJJKJRLJKLKKKUKLLKKUMMKJIQIIIISKJJWKLLXMLMYMLNYMMYMLLWJIQIINFGKFFKEEIDHEDHDDFCECCFDECCFCFDGCDGCGCGEGCDCECECFDFCGDGCIEKEOAYNFBREUXKPQMMQTKT MMNJLPPVYYYTOUOPOLLJKKJJJIJIMJJJLIJJLLJIIHHIHHHIGHIHIHJHHHJHHIHGHGHFGHGFFEFEEEFEFEFFGGHIHIHGHGHHIIIIHIIJMNLONKLKKKKKKKMLKKLONMKOOOMLOPONMNMKKLLKKLMNKLMMMNMOPPOORPORSSVRTSSRTRRTSSTTXSTQRPONOKKLKLJMKJJIJIIHHHIIIJHIJIJJIJIKJIMWMYYDAAAAAAAAAAA

AAAAAAAAAAABAABAACAACACAACADADAEADADADADDAEAEEAEAFEAEEAEFAFGAGGGAGGGAHHHAHIIIAIHIJHAIIHIHHAJIHIJIJKJAJJJIKJJJJKKJKJKKLKLKLLMMMNNMYOOOOOOPOONYOONONNPYNOOOPYOOPPPYNONNYMLLWLLKUJIISHIHOGGMFGFLFFMGGLFGLGFLFFKFKFFLEEKFLEFJFKFGNGNHLFHJFIEGDIEKGOIRFGBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABABACACDACADDACADDADDAEDAFEAEEFAFFFAFFGAFGGGAIGHHIAHIHHHHAHIHIIJJIIAIIIIJIJKJIIIIJJHIIHIIIIJIIIIRJJJJKJJJJLVKLLKLLKXLMMKMXMLLLMWMMMMYMNLYMNNYNNMYMMNYMLYLMLXKJRIHPHIMGGMFEJEJEEIEEHDGCDFCFDCFCECECCEBEBECFDGCFDNGLDBAAAAAAAAAAAAAAAAAAAAAABAAAAABAABABAACACACACACACACADDADAEEAFAFGAFGAHGAGGAGGHAGGIAIHJAJJJJAJKKKKAMLMNNNANOMMNNMMNAONMNOOOMOOPOMNOMMNPOOPPPP RQQYPPRPPPPPNOYLLMMMMLYLMLMLYLMLMMYLNNMYNLLWMLKXLLLUKIKQIIQGHHPFHNGFLFFLGFJEEJEIDDIDCHDFCDGCFCCFCECECCECFCGDGDHDHDIFIDEBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABBBBBCBCCCCDCCCCCCCCDDDDEDEEEEFFDEGGHGHHHGHHHHHHIIJJJJJIJJJJJJIKJJKLKKMMNMMMMMMMNNNNNNLNNONPONNNOOOOPQQQRSSSSSSUTSTUUUVWVVXUYXWVXVXWYVYWYVYYUWVUTTSSPQPQOPOPONONOMONOOONNNMMNLJJKJIIJHHGGGFHFGFFFFEEEDDEEEEFGGIGJLRNEAAAAAAAAAAAAA

Qualsiasi aiuto o suggerimento sarebbe apprezzato.

+0

potresti essere in grado di gestire le tue stringhe quattro byte alla volta con la funzione HEX. –

risposta

0

L'unico modo in cui si sarebbe in grado di utilizzare una serie di ordinamenti sarebbe utilizzare tabelle temporanee e cursori/gruppi di risultati.

Il problema è che sarà necessario ripetere le stringhe e utilizzare la sottostringa per separarle. Per quanto ne so, non esiste una funzione 'wordwrap' o 'explode' per tagliare la stringa.