Как заставить клиента командной строки mysql не печатать поля blob в select *

Изучение некоторых таблиц с полями blob. Как я могу сделать select * с клиентом командной строки и заставить его сбрасывать печать (или обрезать до стандартной ширины поля) поля blob, а не прокручивать кучу бинарного мусора на экране? Это с клиентом mysql 5.1. Просто хочу сделать select * и не перечислить все поля non-blob отдельно для разработки.

Ответ 1

Это может быть выполнено изначально в MySQL, но это довольно громоздко:

SET @sql=CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
    INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='test' 
    AND DATA_TYPE!='blob'), ' FROM test.test');
PREPARE preparedsql FROM @sql;
EXECUTE preparedsql;
DEALLOCATE PREPARE preparedsql;

Я обычно предпочитаю BASH aliases/function для процедур MySQL, поскольку они более переносимы между системами:

function blobless()
{
  cols=''
  _ifs=$IFS
  IFS=$(echo -en "\n\b")
  for col in $(mysql --skip-column-names -e "SELECT COLUMN_NAME FROM 
      INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$1' AND TABLE_NAME='$2' 
      AND DATA_TYPE NOT LIKE '%blob'"); do 
    cols="$cols,$col"
  done
  IFS=$_ifs
  mysql -e "SELECT $(echo $cols | cut -c2-) FROM $1.$2 $3"
}

Вызвать так:

[andy ~]# blobless test test "where id>0"
+----+--------+
| id | t      |
+----+--------+
|  1 | 123    |
|  2 | 124213 |
+----+--------+

Если вы находитесь в клиентской консоли MySQL, используйте Ctrl-Z для приостановки программы и перехода к оболочке. Затем используйте blobless db table, чтобы проверить, что нечеткие данные. fg вернет приостановленное задание (то есть клиент MySQL) на передний план.

Вы можете установить данные о соединении MySQL по умолчанию в ~/.my.cnf (howto), чтобы сохранить вас, чтобы предоставить хост/пользователь/передать команду line - это также будет использоваться функциями BASH.