2012-03-23 21 views
9

Ikili yazılan bir sütun içeren bir tablo içeren bir MySQL veritabanım var. Bu sütunu, örneğin HEX() aracılığıyla çalıştırmak zorunda kalmadan yansıtmayı çok isterim. mysql CLI aracının, konsolumun komik/rahatsız edici şekillerde yorumlanması için isteğe bağlı bayt çıkmayacak şekilde ikili veri gösterimini görüntülemek için bir yapılandırma seçeneği veya başka araçlar var mı? Eğer bir görünüm oluşturmak, çoğunlukla kolaylık için tabloya bakmak istiyorum bu yanamysql CLI aracı ikili veriyi konsol dostu bir şekilde göstermenin bir yolunu sunuyor mu?

+0

HEX 'sorununun ne()'? Mükemmel bir çözüm gibi görünüyor. – wallyk

+3

Çünkü gerçekten istediğim tek şey hızlı bir şekilde "SELECT * ..." olması oldukça zor. –

cevap

10

:

SELECT * FROM myview; 
+0

Bu bir çözüm değil, ancak mükemmel değil. – smartwjw

5

davranışı: Sonra

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

, yapmanız gereken tek şey, referans myview yerine table olduğunu MySQL komut satırı istemcisinin sonuç kümelerini ikili verilerle görüntülerken bana her zaman bir can sıkıntısı oldu, aslında bu sayfayı buldum çünkü bir kez daha MySQL komut satırı istemcisinden rahatsız oldum (ikili veriyi benim terminime döktüm) nal, ikili UUID sütunları ile bir sonuç kümesine bakarken) ve sorunu çözmek istedim bir kez ve tüm :-) için

Görünümler oluşturma gerçekten benim için bir seçenek değil. ikili UUID sütunları) ve aynı zamanda tüm sütun adlarını yazmak için SELECT * arasında geçiş yapmak gerçekten rahatsız edici olduğunu buldum (sadece HEX() bir sütunun değerine uygulanabilir).

Sonunda, bu sıkıntıya alternatif çözümler için ilham veren bir hack hack reklamıyla geldim: Terminal oluşturma için çıktıyı sterilize etmek için özel bir çağrı komutu kullanma. Burada şöyle çalışır:

#!/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) 
  • Başlangıç ​​MySQL komut satırı istemcisi aşağıdaki gibi:

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

    1. Aşağıdaki içeriğe sahip bir yürütülebilir (chmod + x) Python komut dosyası oluşturun

      Python betiğinin yol adını geçerli olarak değiştirin. Komut dosyasını $PATH'a da koyabilirsiniz, bu durumda adı --pager seçeneğine iletebilirsiniz (MySQL istemcisi için bir çağrı cihazı olarak nasıl kullanacağınız gibi) (less çağrı cihazını nasıl kullanacağınız gibi).

    2. Şimdi ne zaman SELECT ..., değerinin içerdiği olmayan basılabilir karakterler tam değer MySQL'ın HEX() fonksiyonun sonuçlarına benzer onaltılık karakter olarak işlenir böylece yeniden yazılarak bir sütun gösteren herhangi bir satır.

    Yasal Uyarı: Bu Python ben gösterdi pasajı örneğin, uzak komple çözümünden (dolayısıyla --vertical seçenek) SELECT ... \G biçimi çıkışı beklediğini ve içerecek şekilde kaçınılmazdır yüzden tüm beş dakika için test böcek.

    Sorunum, sorunun MySQL komut satırı istemcisinin yanında çözülebildiğini göstermekti, çünkü sorun şu ki!(bu yüzden sunucu tarafı görünümlerini tanımlamak benim için geriye doğru geliyor - sadece bir komut satırı istemcisi daha kullanıcı dostu yapmak için: -P)

  • 0

    Benim için veritabanı boyutu ile ilgili bir sorun yok, bu yüzden iki farklı sütun kullanacağım her tabloda, biri ikili (16), ikincisi ise indeksleme olmadan char (32) olarak. her ikisi de aynı değere sahip olacak. aramam gerektiğinde, ikili sütunu kullanacağım ve okumam gerektiğinde char (32) kullanacağım. Bu senaryoda herhangi bir sorun var mı? Benim için /etc/my.cnf çalışmalarında

    2

    Set MySQL istemci seçenekleri:

    [client] 
    binary-as-hex = true 
    
    [mysql] 
    binary-as-hex = true 
    
    İlgili konular