Rechercher dans le manuel MySQL
4.5.1.6 mysql CLient Tips
This section describes some techniques that can help you use mysql more effectively.
4.5.1.6.1 Input-Line Editing
mysql supports input-line editing, which enables you to modify the current input line in place or recall previous input lines. For example, the left-arrow and right-arrow keys move horizontally within the current input line, and the up-arrow and down-arrow keys move up and down through the set of previously entered lines. Backspace deletes the character before the cursor and typing new characters enters them at the cursor position. To enter the line, press Enter.
On Windows, the editing key sequences are the same as
supported for command editing in console windows. On Unix, the
key sequences depend on the input library used to build
mysql (for example, the
libedit
or readline
library).
Documentation for the libedit
and
readline
libraries is available online. To
change the set of key sequences permitted by a given input
library, define key bindings in the library startup file. This
is a file in your home directory: .editrc
for libedit
and
.inputrc
for readline
.
For example, in libedit
,
Control+W deletes everything before the
current cursor position and Control+U deletes
the entire line. In readline
,
Control+W deletes the word before the cursor
and Control+U deletes everything before the
current cursor position. If mysql was built
using libedit
, a user who prefers the
readline
behavior for these two keys can
put the following lines in the .editrc
file (creating the file if necessary):
bind "^W" ed-delete-prev-word
bind "^U" vi-kill-line-prev
To see the current set of key bindings, temporarily put a line
that says only bind
at the end of
.editrc
. mysql will
show the bindings when it starts.
Windows provides APIs based on UTF-16LE for reading from and
writing to the console; the mysql client
for Windows is able to use these APIs. The Windows installer
creates an item in the MySQL menu named MySQL command
line client - Unicode
. This item invokes the
mysql client with properties set to
communicate through the console to the MySQL server using
Unicode.
To take advantage of this support manually, run mysql within a console that uses a compatible Unicode font and set the default character set to a Unicode character set that is supported for communication with the server:
Open a console window.
Go to the console window properties, select the font tab, and choose Lucida Console or some other compatible Unicode font. This is necessary because console windows start by default using a DOS raster font that is inadequate for Unicode.
Execute mysql.exe with the
--default-character-set=utf8
(orutf8mb4
) option. This option is necessary becauseutf16le
is one of the character sets that cannot be used as the client character set. See Impermissible Client Character Sets.
With those changes, mysql will use the Windows APIs to communicate with the console using UTF-16LE, and communicate with the server using UTF-8. (The menu item mentioned previously sets the font and character set as just described.)
To avoid those steps each time you run
mysql, you can create a shortcut that
invokes mysql.exe. The shortcut should set
the console font to Lucida Console or some other compatible
Unicode font, and pass the
--default-character-set=utf8
(or
utf8mb4
) option to
mysql.exe.
Alternatively, create a shortcut that only sets the console
font, and set the character set in the
[mysql]
group of your
my.ini
file:
[mysql]
default-character-set=utf8
Some query results are much more readable when displayed vertically, instead of in the usual horizontal table format. Queries can be displayed vertically by terminating the query with \G instead of a semicolon. For example, longer text values that include newlines often are much easier to read with vertical output:
- *************************** 1. row ***************************
- msg_nro: 3068
- time_zone: +0200
- mail_from: Monty
- reply: monty@no.spam.com
- sbj: UTF-8
- txt: >>>>> "Thimble" == Thimble Smith writes:
- Thimble> TODO list and see what happens.
- Yes, please do that.
- Regards,
- Monty
- file: inbox-jani-1
- hash: 190402944
- 1 row in set (0.09 sec)
For beginners, a useful startup option is
--safe-updates
(or
--i-am-a-dummy
,
which has the same effect). Safe-updates mode is helpful for
cases when you might have issued an
UPDATE
or
DELETE
statement but forgotten
the WHERE
clause indicating which rows to
modify. Normally, such statements update or delete all rows in
the table. With --safe-updates
,
you can modify rows only by specifying the key values that
identify them, or a LIMIT
clause, or both.
This helps prevent accidents. Safe-updates mode also restricts
SELECT
statements that produce
(or are estimated to produce) very large result sets.
The --safe-updates
option causes
mysql to execute the following statement
when it connects to the MySQL server, to set the session
values of the
sql_safe_updates
,
sql_select_limit
, and
max_join_size
system
variables:
The
SET
statement affects statement processing as follows:
Enabling
sql_safe_updates
causesUPDATE
andDELETE
statements to produce an error if they do not specify a key constraint in theWHERE
clause, or provide aLIMIT
clause, or both. For example:Setting
sql_select_limit
to 1,000 causes the server to limit allSELECT
result sets to 1,000 rows unless the statement includes aLIMIT
clause.Setting
max_join_size
to 1,000,000 causes multiple-tableSELECT
statements to produce an error if the server estimates it must examine more than 1,000,000 row combinations.
To specify result set limits different from 1,000 and
1,000,000, you can override the defaults by using the
--select_limit
and
--max_join_size
options when you
invoke mysql:
mysql --safe-updates --select_limit=500 --max_join_size=10000
It is possible for UPDATE
and
DELETE
statements to produce an
error in safe-updates mode even with a key specified in the
WHERE
clause, if the optimizer decides not
to use the index on the key column:
Range access on the index cannot be used if memory usage exceeds that permitted by the
range_optimizer_max_mem_size
system variable. The optimizer then falls back to a table scan. See Limiting Memory Use for Range Optimization.If key comparisons require type conversion, the index may not be used (see Section 8.3.1, “How MySQL Uses Indexes”). Suppose that an indexed string column
c1
is compared to a numeric value usingWHERE c1 = 2222
. For such comparisons, the string value is converted to a number and the operands are compared numerically (see Section 12.2, “Type Conversion in Expression Evaluation”), preventing use of the index. If safe-updates mode is enabled, an error occurs.
As of MySQL 8.0.13, safe-updates mode also includes these behaviors:
EXPLAIN
withUPDATE
andDELETE
statements does not produce safe-updates errors. This enables use ofEXPLAIN
plusSHOW WARNINGS
to see why an index is not used, which can be helpful in cases such as when arange_optimizer_max_mem_size
violation or type conversion occurs and the optimizer does not use an index even though a key column was specified in theWHERE
clause.When a safe-updates error occurs, the error message includes the first diagnostic that was produced, to provide information about the reason for failure. For example, the message may indicate that the
range_optimizer_max_mem_size
value was exceeded or type conversion occurred, either of which can preclude use of an index.For multiple-table deletes and updates, an error is produced with safe updates enabled only if any target table uses a table scan.
If the mysql client loses its connection to the server while sending a statement, it immediately and automatically tries to reconnect once to the server and send the statement again. However, even if mysql succeeds in reconnecting, your first connection has ended and all your previous session objects and settings are lost: temporary tables, the autocommit mode, and user-defined and session variables. Also, any current transaction rolls back. This behavior may be dangerous for you, as in the following example where the server was shut down and restarted between the first and second statements without you knowing it:
- Query OK, 0 rows affected (0.05 sec)
- ERROR 2006: MySQL server has gone away
- Connection id: 1
- Current database: test
- Query OK, 1 row affected (1.30 sec)
- +------+
- | a |
- +------+
- +------+
The @a
user variable has been lost with the
connection, and after the reconnection it is undefined. If it
is important to have mysql terminate with
an error if the connection has been lost, you can start the
mysql client with the
--skip-reconnect
option.
For more information about auto-reconnect and its effect on state information when a reconnection occurs, see Section 28.7.28, “C API Automatic Reconnection Control”.
Traduction non disponible
Le manuel MySQL n'est pas encore traduit en français sur l'infobrol. Seule la version anglaise est disponible pour l'instant.
Document créé le 26/06/2006, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/mysql-rf-mysql-tips.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.