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?
cevap
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 ...
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).Şimdi ne zaman
SELECT ...
, değerinin içerdiği olmayan basılabilir karakterler tam değer MySQL'ınHEX()
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)
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
Set MySQL istemci seçenekleri:
[client]
binary-as-hex = true
[mysql]
binary-as-hex = true
HEX 'sorununun ne()'? Mükemmel bir çözüm gibi görünüyor. – wallyk
Çünkü gerçekten istediğim tek şey hızlı bir şekilde "SELECT * ..." olması oldukça zor. –