Spec-Zone.ru › MySQL 9.2

6.5.1.6 Советы по работе с mysql

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

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

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

  • Поддержка Unicode в 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 Event Viewer, если для запуска mysql был использован параметр --syslog. Закрытие окна консоли также очищает текущий буфер истории.

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

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

Поддержка Unicode в Windows

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

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

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

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

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

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

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

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

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

Результаты некоторых запросов легче читать в вертикальном формате, а не в обычном горизонтальном табличном формате. Запросы можно выводить вертикально, завершая запрос \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, что имеет тот же эффект). Режим safe-updates полезен в тех случаях, когда вы можете выполнить оператор UPDATE или DELETE, но забыли о ключе WHERE, указывающем, какие строки нужно изменить. Обычно такие операторы обновляют или удаляют все строки в таблице. С --safe-updates вы можете изменять строки только, указав значения ключей, которые их идентифицируют, или с помощью ключевого слова LIMIT, или с использованием обоих. Это помогает предотвратить ошибки. Режим safe-updates также ограничивает операторы 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 в 1 000 000 приводит к ошибке операторов SELECT с несколькими таблицами, если сервер оценивает, что ему необходимо проверить более 1 000 000 комбинаций строк.

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

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

Возможны ситуации, когда операторы UPDATE и DELETE порождают ошибку в режиме safe-updates даже при указании ключа в ключевом WHERE-оператор, если оптимизатор решает не использовать индекс по столбцу ключа:

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

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

Эти особенности включены в режим safe-updates:

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

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

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

Отключение автоматического переподключения 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-8.4-en/mysql-tips.html

Spec-Zone.ru

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