6.5.1.6 Советы по работе с 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, поддерживаемую для связи с сервером:
Откройте окно консоли.
Перейдите к свойствам окна консоли, выберите вкладку «Шрифт» и выберите шрифт Lucida Console или другой совместимый шрифт Unicode. Это необходимо, потому что консольные окна по умолчанию используют шрифт DOS, который не подходит для Unicode.
Выполните 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_nameSETnot_key_column=valWHEREkey_column=val; UPDATEtbl_nameSETnot_key_column=valLIMIT 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.