2012-03-23 5 views
9

Ho un database MySQL contenente una tabella con una colonna di tipo binario. Mi piacerebbe essere in grado di proiettare quella colonna senza doverla attraversare, ad es. HEX(). Lo strumento CLI mysql ha un'opzione di configurazione o altri mezzi per visualizzare una rappresentazione di dati binari in un modo che non produrrà byte arbitrari per la mia console da interpretare in modi esilaranti/fastidiosi?Lo strumento CLI mysql fornisce un modo per visualizzare dati binari in modo da facilitare la console?

+0

Cosa c'è di sbagliato con 'HEX()'? Sembra la soluzione perfetta. – wallyk

+3

Perché doverlo fare quando tutto ciò che voglio veramente è un rapido 'SELECT * ...' è abbastanza scomodo. –

risposta

10

Dal momento che si desidera guardare la tabella per lo più per convenienza, creare una vista:

CREATE OR REPLACE VIEW myview AS 
SELECT col1, HEX(col2) AS col2, col3, etc.... 
FROM table; 

Poi, tutto quello che dovete fare è di riferimento myview invece di table:

SELECT * FROM myview; 
+0

È una soluzione anche se non è perfetta. – smartwjw

5

Il comportamento del client della riga di comando MySQL durante la visualizzazione di set di risultati con dati binari è sempre stato un fastidio per me, infatti ho trovato questa pagina perché ero ancora una volta infastidito dal client della riga di comando MySQL (scaricando dati binari nel mio nal guardando un set di risultati con colonne UUID binarie) e volevo risolvere il problema una volta per tutte :-)

Creare viste non è un'opzione per me (sto osservando dozzine di tabelle con colonne UUID binarie) e ho anche scoperto che è davvero fastidioso passare da SELECT * alla digitazione di tutti i nomi di colonna (solo così HEX() può essere applicato al valore di una colonna).

Alla fine mi sono inventato un creativo mod che fornisce ispirazione per soluzioni alternative a questo fastidio: Utilizzo di un comando personalizzato cercapersone per disinfettare l'output per il rendering del terminale. Ecco come funziona:

  1. creare un file eseguibile (chmod + x) script Python con il seguente contenuto:

    #!/usr/bin/python 
    
    import binascii, string, sys 
    
    for line in sys.stdin: 
        line = line.rstrip() 
        column, _, value = line.partition(': ') 
        if any(c not in string.printable for c in value): 
         sys.stdout.write("%s: %s\n" % (column, binascii.hexlify(value))) 
        else: 
         sys.stdout.write("%s\n" % line) 
    
  2. Avviare il client a riga di comando di MySQL come segue:

    $ mysql --pager=/home/peter/binary-filter.py --vertical ... 
    

    Modificare il nome del percorso dello script Python come applicabile. Puoi anche inserire lo script nel tuo $PATH, in tal caso puoi semplicemente passare il nome all'opzione --pager (simile a come useresti less come cercapersone per il client MySQL).

  3. Ora, quando si SELECT ..., qualsiasi riga che mostra una colonna il cui valore contiene caratteri non stampabili è riscritto in modo che il valore completo è reso come caratteri esadecimali, simili ai risultati della funzione di MySQL HEX().

Disclaimer: Questo è lontano da una soluzione completa, per esempio Python frammento mostrai attende SELECT ... \G formato di uscita (da cui l'opzione --vertical) e testato per tutti cinque minuti quindi è destinata a contenere bug.

Il mio punto era dimostrare che il problema può essere risolto dal lato del client della riga di comando MySQL, perché è lì che si trova il problema!(questo è il motivo per cui mi sento indietro per definire le viste lato server - solo per rendere un client da riga di comando più facile :-P)

0

Per me non c'è alcun problema con le dimensioni del database, quindi userò due colonne diverse in ogni tabella, uno come binario (16) e il secondo come char (32) senza indicizzazione. entrambi avranno lo stesso valore. quando ho bisogno di cercare userò la colonna binaria, e quando ho bisogno di leggere userò char (32). c'è qualche problema con questo scenario?

2

Impostare le opzioni client MySQL in /etc/my.cnf opere per me:

[client] 
binary-as-hex = true 

[mysql] 
binary-as-hex = true 
Problemi correlati