Spec-Zone.ru › MySQL 5.7

4.5.1.6 mysql Client Tips

В этом разделе представлена информация о техниках для более эффективного использования mysql и об особенностях работы mysql.

  • Редактирование входных строк

  • Отключение интерактивной истории

  • Поддержка Юникода в Windows

  • Вывод результатов запросов вертикально

  • Использование режима Safe-Updates (--safe-updates)

  • Отключение автоматического переподключения mysql

  • mysql Клиентский парсер против серверного парсера

Редактирование входных строк

mysql поддерживает редактирование входных строк, что позволяет изменять текущую строку или вызывать предыдущие. Например, клавиши влево и вправо перемещают курсор горизонтально в текущей строке, а клавиши вверх и вниз перемещают курсор по истории предыдущих строк. Backspace удаляет символ перед курсором, а ввод новых символов помещает их в позицию курсора. Для завершения ввода нажмите Enter.

В Windows последовательности клавиш редактирования такие же, как и для редактирования команд в консольных окнах. В Unix последовательности клавиш зависят от библиотеки ввода, используемой для построения mysql (например, библиотеки libedit или readline).

Документация для библиотек libedit и readline доступна в сети. Для изменения набора последовательностей клавиш, разрешенных данной библиотекой ввода, задайте настройки клавиш в файле запуска библиотеки. Это файл в вашем домашнем каталоге: .editrc для libedit и .inputrc для readline.

Например, в libedit, Control+W удаляет все символы до текущей позиции курсора, а Control+U удаляет всю строку. В readline, Control+W удаляет слово перед курсором, а Control+U удаляет все символы до текущей позиции курсора. Если mysql был скомпилирован с использованием libedit, пользователь, предпочитающий поведение readline для этих двух клавиш, может поместить следующие строки в файл .editrc (если он не существует).

bind "^W" ed-delete-prev-word
bind "^U" vi-kill-line-prev

Чтобы увидеть текущий набор назначений клавиш, временно поместите строку, содержащую только bind, в конец файла .editrc. Тогда mysql отобразит назначения при запуске.

Отключение интерактивной истории

Ключ вверх позволяет восстанавливать введенные строки из текущих и предыдущих сессий. В тех случаях, когда консоль используется совместно, это поведение может быть неподходящим. mysql поддерживает частичное или полное отключение интерактивной истории, в зависимости от платформы хоста.

В Windows история хранится в памяти. Alt+F7 удаляет все введённые строки, сохранённые в памяти текущего буфера истории. Также удаляется список последовательных номеров перед введенными строками, отображаемыми с помощью F7 и вызываемыми (по номеру) с помощью F9. Новые введенные строки после нажатия Alt+F7 повторно заполняют текущий буфер истории. Очистка буфера не препятствует записи в журнал событий Windows, если для запуска mysql использовалась опция --syslog. Закрытие окна консоли также очищает текущий буфер истории.

Для отключения интерактивной истории в Unix, сначала удалите файл .mysql_history, если он существует (в противном случае предыдущие записи будут вызываться). Затем запустите mysql с опцией --histignore="*", чтобы проигнорировать все новые введённые строки. Для повторного включения возможности восстановления (и ведения журнала), перезапустите mysql без этой опции.

Если вы предотвращаете создание файла .mysql_history (см. Управление файлом истории) и используете --histignore="*" для запуска клиента mysql, функция восстановления интерактивной истории полностью отключена. В качестве альтернативы, если вы опустите опцию --histignore, вы можете восстановить строки ввода, введённые в текущей сессии.

Поддержка Юникода в Windows

Windows предоставляет API, основанные на UTF-16LE, для чтения из и записи в консоль; клиент mysql для Windows способен использовать эти API. Установщик Windows создаёт элемент в меню MySQL с именем MySQL command line client - Unicode. Этот элемент вызывает клиент mysql с настройками для связи через консоль с сервером MySQL с использованием Юникода.

Чтобы воспользоваться этой поддержкой вручную, запустите mysql в консоли, использующей совместимый шрифт Юникода, и установите кодировку по умолчанию на кодировку Юникода, поддерживаемую для связи с сервером:

  1. Откройте окно консоли.

  2. Перейдите к свойствам окна консоли, выберите вкладку «Шрифт» и выберите шрифт Lucida Console или какой-либо другой совместимый шрифт Юникода. Это необходимо, так как консольные окна по умолчанию используют шрифт DOS, который не подходит для Юникода.

  3. Выполните mysql.exe с опцией --default-character-set=utf8 (или utf8mb4). Эта опция необходима, так как utf16le — одна из кодировок, которую нельзя использовать в качестве кодировки клиента. См. Недопустимые кодировки клиента.

С этими изменениями mysql может использовать API Windows для связи с консолью с помощью UTF-16LE и связываться с сервером с использованием UTF-8. (Элемент меню, упомянутый ранее, устанавливает шрифт и кодировку как описано выше.)

Чтобы избежать этих шагов каждый раз при запуске mysql, вы можете создать ярлык, который запускает mysql.exe. Ярлык должен установить шрифт консоли на Lucida Console или какой-либо другой совместимый шрифт Юникода и передать опцию --default-character-set=utf8 (или utf8mb4) в mysql.exe.

В качестве альтернативы создайте ярлык, который устанавливает только шрифт консоли, и установите кодировку в группе [mysql] файла my.ini:

[mysql]
default-character-set=utf8
Вывод результатов запросов вертикально

Результаты некоторых запросов намного легче читать в вертикальном формате, а не в обычном горизонтальном табличном формате. Запросы можно вывести вертикально, завершив запрос \G вместо точки с запятой. Например, длинные текстовые значения, содержащие новые строки, часто легче читать с вертикальным выводом:

mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Jones
    reply: jones@example.com
  mail_to: "John Smith" <smith@example.com>
      sbj: UTF-8
      txt: >>>>> "John" == John Smith writes:

John> Hi.  I think this is a good idea.  Is anyone familiar
John> with UTF-8 or Unicode? Otherwise, I'll put this on my
John> TODO list and see what happens.

Yes, please do that.

Regards,
Jones
     file: inbox-jani-1
     hash: 190402944
1 row in set (0.09 sec)
Использование режима Safe-Updates (--safe-updates)

Для начинающих полезным вариантом запуска является --safe-updates (или --i-am-a-dummy, имеющий тот же эффект). Режим безопасных обновлений полезен в случаях, когда вы могли выполнить оператор UPDATE или DELETE, но забыли о фразе WHERE, указывающей, какие строки нужно изменить. Обычно такие операторы обновляют или удаляют все строки в таблице. С --safe-updates вы можете изменять строки, только указав значения ключей, которые их идентифицируют, или фразы LIMIT, или оба. Это помогает предотвратить ошибки. Режим безопасных обновлений также ограничивает операторы SELECT, которые генерируют (или ожидается, что они генерируют) очень большие наборы результатов.

Опция --safe-updates заставляет mysql выполнить следующее утверждение при подключении к серверу MySQL, чтобы установить значения сеанса системных переменных sql_safe_updates, sql_select_limit и max_join_size:

SET sql_safe_updates=1, sql_select_limit=1000, max_join_size=1000000;

Оператор SET влияет на обработку операторов следующим образом:

  • Включение sql_safe_updates вызывает ошибку для операторов UPDATE и DELETE, если они не указывают ограничение ключа в фразе WHERE или не предоставляют фразу LIMIT, или оба.

    UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
    
    UPDATE tbl_name SET not_key_column=val LIMIT 1;
    
  • Установка sql_select_limit в 1000 приводит к ограничению всех наборов результатов SELECT до 1000 строк, если оператор не содержит фразу LIMIT.

  • Установка max_join_size в 1000000 приводит к ошибке для операторов SELECT с несколькими таблицами, если сервер оценивает, что ему нужно проверить более 1000000 комбинаций строк.

Чтобы указать пределы наборов результатов, отличные от 1000 и 1000000, можно переопределить значения по умолчанию, используя опции --select-limit и --max-join-size при вызове mysql:

mysql --safe-updates --select-limit=500 --max-join-size=10000

Операторы UPDATE и DELETE могут вызвать ошибку в режиме безопасных обновлений даже при указании ключа во фразе WHERE, если оптимизатор решает не использовать индекс по столбцу ключа:

  • Доступ к диапазону по индексу не может быть использован, если использование памяти превышает разрешенное значение системной переменной range_optimizer_max_mem_size. Тогда оптимизатор переходит к сканированию таблицы. См. Ограничение использования памяти для оптимизации диапазона.

  • Если сравнения ключей требуют преобразования типов, индекс может не использоваться (см. Раздел 8.3.1, «Как MySQL использует индексы»). Предположим, что столбец индексированной строки c1 сравнивается с числовым значением с использованием WHERE c1 = 2222. При таких сравнениях строковое значение преобразуется в число, и операнды сравниваются численно (см. Раздел 12.3, «Преобразование типов в оценке выражений»), что препятствует использованию индекса. Если режим безопасных обновлений включен, возникает ошибка.

Начиная с MySQL 5.7.25, режим безопасных обновлений также включает эти возможности:

  • EXPLAIN с операторами UPDATE и DELETE не выводит ошибки безопасных обновлений. Это позволяет использовать EXPLAIN плюс SHOW WARNINGS для выявления причин, по которым индекс не используется, что может быть полезно в случаях, таких как нарушение range_optimizer_max_mem_size или преобразование типов, и оптимизатор не использует индекс, даже если столбец ключа был указан в фразе WHERE.

  • Когда происходит ошибка безопасных обновлений, сообщение об ошибке включает первое диагностическое сообщение, чтобы предоставить информацию о причине сбоя. Например, сообщение может указывать на превышение значения range_optimizer_max_mem_size или преобразование типов, которые могут препятствовать использованию индекса.

  • При многотабличных удалениях и обновлениях ошибка возникает только при использовании сканирования таблиц любыми целевыми таблицами.

Отключение автоматического переподключения mysql

Если клиент mysql теряет соединение с сервером при отправке оператора, он немедленно и автоматически пытается подключиться к серверу один раз и повторно отправить оператор. Однако даже если mysql успешно переподключается, ваше первое подключение завершено, и все ваши предыдущие объекты сеанса и настройки теряются: временные таблицы, режим автокоммита, пользовательские и сеансовые переменные. Кроме того, любая текущая транзакция отменяется. Это поведение может быть опасным, как в следующем примере, где сервер был остановлен и перезапущен между первым и вторым операторами, и вы об этом не знали:

mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test

Query OK, 1 row affected (1.30 sec)

mysql> SELECT * FROM t;
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.05 sec)

Переменная пользователя @a была потеряна вместе с соединением и после переподключения она не определена. Если важно, чтобы mysql завершился с ошибкой, если соединение было потеряно, вы можете запустить клиент mysql с опцией --skip-reconnect.

Дополнительную информацию об автоматическом переподключении и его влиянии на информацию о состоянии при переподключении см. в .

Парсер клиента mysql по сравнению с парсером сервера

Клиент mysql использует парсер на стороне клиента, который не является дубликатом полного парсера, используемого сервером mysqld на стороне сервера. Это может привести к различиям в обработке определенных конструкций. Примеры:

  • Парсер сервера обрабатывает строки, ограниченные символами ", как идентификаторы, а не как простые строки, если включен режим SQL ANSI_QUOTES.

    Парсер клиента mysql не учитывает режим SQL ANSI_QUOTES. Он обрабатывает строки, ограниченные символами ", ' и ` одинаково, независимо от того, включен ли ANSI_QUOTES.

  • В комментариях /*! ... */ парсер клиента mysql интерпретирует краткие команды mysql. Парсер сервера не интерпретирует их, так как эти команды не имеют смысла на стороне сервера.

    Если желательно, чтобы mysql не интерпретировал краткие команды внутри комментариев, частичным решением является использование опции --binary-mode, которая отключает все команды mysql, за исключением \C и \d в неинтерактивном режиме (для входных данных, перенаправленных в mysql или загруженных с помощью команды source).

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/mysql-tips.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API