Поведение клиента командной строки MySQL при просмотре результирующих наборов с двоичными данными всегда раздражало меня, на самом деле я нашел эту страницу, потому что меня снова раздражал клиент командной строки MySQL (сброс двоичных данных в мойтерминал при просмотре набора результатов с двоичными столбцами UUID), и я хотел решить проблему раз и навсегда: -)
Создание представлений действительно не вариант для меня (я смотрю на десяткитаблицы с двоичными столбцами UUID), и я также обнаружил, что действительно раздражает переключение с SELECT *
на вывод всех имен столбцов вместо этого (просто HEX()
может применяться к значению одного столбца).
В конце концов я придумал креативный хак , который вдохновляет на альтернативные решения этой проблемы: использование настраиваемой команды пейджера для очистки вывода для рендеринга терминала.Вот как это работает:
Создайте исполняемый скрипт (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)
Запустите MySQLклиент командной строки следующим образом:
$ mysql --pager=/home/peter/binary-filter.py --vertical ...
Измените путь к сценарию Python, как это применимо.Вы также можете поместить скрипт в $PATH
, в этом случае вы можете просто передать имя опции --pager
(аналогично тому, как вы использовали бы less
в качестве пейджера для клиента MySQL).
Теперь, когда вы SELECT ...
, любая строка, которая показывает столбец, значение которого содержит непечатаемые символы, переписывается так, что полное значение отображается в виде шестнадцатеричных символов, аналогично результатам HEX()
MySQL *.function.
Отказ от ответственности: Это далеко не полное решение, например, приведенный мною фрагмент Python ожидает вывода в формате SELECT ... \G
(отсюда и опция --vertical
) и я тестировал его все пять минут, поэтому он обязательно должен содержать ошибки.
Я хотел показать, что проблему можно решить на стороне клиента командной строки MySQL, потому что именно в этом проблема!(вот почему мне так сложно задавать представления на стороне сервера - только для того, чтобы сделать клиент командной строки более удобным для пользователя :-P)