Предоставляет ли инструмент mysql CLI способ отображения двоичных данных в удобной для консоли форме? - PullRequest
12 голосов
/ 23 марта 2012

У меня есть база данных MySQL, содержащая таблицу со столбцом двоичного типа. Я хотел бы иметь возможность проецировать этот столбец без необходимости проходить через него, например, HEX(). Имеется ли в инструменте mysql CLI параметр конфигурации или другие средства для отображения представления двоичных данных таким образом, чтобы не выводить произвольные байты, которые моя консоль может интерпретировать веселыми / раздражающими способами?

Ответы [ 5 ]

12 голосов
/ 09 апреля 2018

Запустить MySQL CLI с параметром - двоичный как шестнадцатеричный

Пример:

mysql --binary-as-hex
10 голосов
/ 23 марта 2012

Поскольку вы хотите смотреть на таблицу в основном для удобства, создайте представление:

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

Затем все, что вам нужно сделать, это ссылка myview вместо table:

SELECT * FROM myview;
7 голосов
/ 26 сентября 2017

Установить параметры клиента mysql в /etc/my.cnf у меня работает:

[client]
binary-as-hex = true

[mysql]
binary-as-hex = true
5 голосов
/ 15 октября 2015

Поведение клиента командной строки MySQL при просмотре результирующих наборов с двоичными данными всегда раздражало меня, на самом деле я нашел эту страницу, потому что меня снова раздражал клиент командной строки MySQL (сброс двоичных данных в мойтерминал при просмотре набора результатов с двоичными столбцами UUID), и я хотел решить проблему раз и навсегда: -)

Создание представлений действительно не вариант для меня (я смотрю на десяткитаблицы с двоичными столбцами UUID), и я также обнаружил, что действительно раздражает переключение с SELECT * на вывод всех имен столбцов вместо этого (просто HEX() может применяться к значению одного столбца).

В конце концов я придумал креативный хак , который вдохновляет на альтернативные решения этой проблемы: использование настраиваемой команды пейджера для очистки вывода для рендеринга терминала.Вот как это работает:

  1. Создайте исполняемый скрипт (chmod + x) Python со следующим содержимым:

    #!/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. Запустите MySQLклиент командной строки следующим образом:

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

    Измените путь к сценарию Python, как это применимо.Вы также можете поместить скрипт в $PATH, в этом случае вы можете просто передать имя опции --pager (аналогично тому, как вы использовали бы less в качестве пейджера для клиента MySQL).

  3. Теперь, когда вы SELECT ..., любая строка, которая показывает столбец, значение которого содержит непечатаемые символы, переписывается так, что полное значение отображается в виде шестнадцатеричных символов, аналогично результатам HEX() MySQL *.function.

Отказ от ответственности: Это далеко не полное решение, например, приведенный мною фрагмент Python ожидает вывода в формате SELECT ... \G (отсюда и опция --vertical) и я тестировал его все пять минут, поэтому он обязательно должен содержать ошибки.

Я хотел показать, что проблему можно решить на стороне клиента командной строки MySQL, потому что именно в этом проблема!(вот почему мне так сложно задавать представления на стороне сервера - только для того, чтобы сделать клиент командной строки более удобным для пользователя :-P)

0 голосов
/ 08 декабря 2016

Для меня нет проблем с размером базы данных, поэтому я буду использовать два разных столбца в каждой таблице, один как двоичный (16), а второй как char (32) без индексации. оба они будут иметь одинаковое значение. когда мне нужно искать, я буду использовать двоичный столбец, а когда мне нужно прочитать, я буду использовать char (32). есть ли проблемы с этим сценарием?

...