== About the <<fixed>>mysql<</fixed>> Command-line Client
**<<fixed>>mysql<</fixed>>** is a simple SQL shell (with GNU readline
capabilities). It supports interactive and noninteractive use. When used
interactively, query results are presented in an ASCII-table format. When used
noninteractively (for example, as a filter), the result is presented in
tab-separated format. The output format can be changed using command options.
If you have problems due to insufficient memory for large result sets, use the
<<fixed>>--quick<</fixed>> option. This forces mysql to retrieve results from
the server a row at a time rather than retrieving the entire result set and
buffering it in memory before displaying it. This is done by returning the
result set using the <<code>>mysql_use_result()<</code>> C API function in the
client/server library rather than <<code>>mysql_store_result()<</code>>.
Using mysql is very easy. Invoke it from the prompt of your command interpreter
as follows:
<<fixed>>
shell> **mysql** //db_name//
<</fixed>>
Or:
<<fixed>>
shell> **mysql** --user=//user_name// --password=//your_password db_name//
<</fixed>>
Then type an SQL statement, end it with “;”, \g, or \G and press Enter.
As of MySQL 5.1.10, typing Control-C causes mysql to attempt to kill the
current statement. If this cannot be done, or Control-C is typed again before
the statement is killed, mysql exits. Previously, Control-C caused mysql to
exit in all cases.
You can execute SQL statements in a script file (batch file) like this:
<<fixed>>
shell> **mysql** //db_name// < //script.sql// > //output.tab//
<</fixed>>
== <<code>>mysql<</code>> Options
Options can be specified on the command line or in the
<<fixed>>[mysql]<</fixed>> and <<fixed>>[client]<</fixed>> option file groups
of a my.cnf file. The full list of supported options can be obtained with:
<<fixed>>
shell> **mysql** --verbose --help
<</fixed>>
In MariaDB 5.1.49 the output of the above command is:
<<fixed>>
shell> **mysql** --verbose --help
mysql Ver 14.16 Distrib 5.1.49-MariaDB, for debian-linux-gnu (i486) using readline 5.1
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Usage: mysql [OPTIONS] [database]
-?, --help Display this help and exit.
-I, --help Synonym for -?
--abort-source-on-error
Abort 'source filename' operations in case of errors
--auto-rehash Enable automatic rehashing. One doesn't need to use
'rehash' to get table and field completion, but startup
and reconnecting may take a longer time. Disable with
--disable-auto-rehash.
-A, --no-auto-rehash
No automatic rehashing. One has to use 'rehash' to get
table and field completion. This gives a quicker start of
mysql and disables rehashing on reconnect.
-B, --batch Don't use history file. Disable interactive behavior.
(Enables --silent.)
--character-sets-dir=name
Directory for character set files.
--column-type-info Display column type information.
-c, --comments Preserve comments. Send comments to the server. The
default is --skip-comments (discard comments), enable
with --comments.
-C, --compress Use compression in server/client protocol.
-#, --debug[=#] This is a non-debug version. Catch this and exit.
--debug-check Check memory and open file usage at exit.
-T, --debug-info Print some debug info at exit.
-D, --database=name Database to use.
--default-character-set=name
Set the default character set.
--delimiter=name Delimiter to be used.
-e, --execute=name Execute command and quit. (Disables --force and history
file.)
-E, --vertical Print the output of a query (rows) vertically.
-f, --force Continue even if we get an SQL error. Sets
abort-source-on-error to 0
-G, --named-commands
Enable named commands. Named commands mean this program's
internal commands; see mysql> help . When enabled, the
named commands can be used from any line of the query,
otherwise only from the first line, before an enter.
Disable with --disable-named-commands. This option is
disabled by default.
-g, --no-named-commands
Named commands are disabled. Use \* form only, or use
named commands only in the beginning of a line ending
with a semicolon (;). Since version 10.9, the client now
starts with this option ENABLED by default. Disable with
'-G'. Long format commands still work from the first
line. WARNING: option deprecated; use
--disable-named-commands instead.
-i, --ignore-spaces Ignore space after function names.
--local-infile Enable/disable LOAD DATA LOCAL INFILE.
-b, --no-beep Turn off beep on error.
-h, --host=name Connect to host.
-H, --html Produce HTML output.
-X, --xml Produce XML output.
--line-numbers Write line numbers for errors.
-L, --skip-line-numbers
Don't write line number for errors.
-n, --unbuffered Flush buffer after each query.
--column-names Write column names in results.
-N, --skip-column-names
Don't write column names in results.
-O, --set-variable=name
Change the value of a variable. Please note that this
option is deprecated; you can set variables directly with
--variable-name=value.
--sigint-ignore Ignore SIGINT (CTRL-C).
-o, --one-database Only update the default database. This is useful for
skipping updates to other database in the update log.
--pager[=name] Pager to use to display results. If you don't supply an
option, the default pager is taken from your ENV variable
PAGER. Valid pagers are less, more, cat [> filename],
etc. See interactive help (\h) also. This option does not
work in batch mode. Disable with --disable-pager. This
option is disabled by default.
--no-pager Disable pager and print to stdout. See interactive help
(\h) also. WARNING: option deprecated; use
--disable-pager instead.
-p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty.
-P, --port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
--prompt=name Set the mysql prompt to this value.
--protocol=name The protocol to use for connection (tcp, socket, pipe,
memory).
-q, --quick Don't cache result, print it row by row. This may slow
down the server if the output is suspended. Doesn't use
history file.
-r, --raw Write fields without conversion. Used with --batch.
--reconnect Reconnect if the connection is lost. Disable with
--disable-reconnect. This option is enabled by default.
-s, --silent Be more silent. Print results with a tab as separator,
each row on new line.
-S, --socket=name The socket file to use for connection.
--ssl Enable SSL for connection (automatically enabled with
other flags).Disable with --skip-ssl.
--ssl-ca=name CA file in PEM format (check OpenSSL docs, implies
--ssl).
--ssl-capath=name CA directory (check OpenSSL docs, implies --ssl).
--ssl-cert=name X509 cert in PEM format (implies --ssl).
--ssl-cipher=name SSL cipher to use (implies --ssl).
--ssl-key=name X509 key in PEM format (implies --ssl).
--ssl-verify-server-cert
Verify server's "Common Name" in its cert against
hostname used when connecting. This option is disabled by
default.
-t, --table Output in table format.
--tee=name Append everything into outfile. See interactive help (\h)
also. Does not work in batch mode. Disable with
--disable-tee. This option is disabled by default.
--no-tee Disable outfile. See interactive help (\h) also. WARNING:
Option deprecated; use --disable-tee instead.
-u, --user=name User for login if not current user.
-U, --safe-updates Only allow UPDATE and DELETE that uses keys.
-U, --i-am-a-dummy Synonym for option --safe-updates, -U.
-v, --verbose Write more. (-v -v -v gives the table output format).
-V, --version Output version information and exit.
-w, --wait Wait and retry if connection is down.
--connect_timeout=# Number of seconds before connection timeout.
--max_allowed_packet=#
The maximum packet length to send to or receive from
server.
--net_buffer_length=#
The buffer size for TCP/IP and socket communication.
--select_limit=# Automatic limit for SELECT when using --safe-updates.
--max_join_size=# Automatic limit for rows in a join when using
--safe-updates.
--secure-auth Refuse client connecting to server if it uses old
(pre-4.1.1) protocol.
--server-arg=name Send embedded server this as a parameter.
--show-warnings Show warnings after every statement.
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
The following groups are read: mysql client
The following options may be given as the first argument:
--print-defaults Print the program argument list and exit.
--no-defaults Don't read default options from any option file.
--defaults-file=# Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
Variables (--variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
--------------------------------- -----------------------------
abort-source-on-error FALSE
auto-rehash TRUE
character-sets-dir (No default value)
column-type-info FALSE
comments FALSE
compress FALSE
debug-check FALSE
debug-info FALSE
database (No default value)
default-character-set latin1
delimiter ;
vertical FALSE
force FALSE
named-commands FALSE
ignore-spaces FALSE
local-infile FALSE
no-beep FALSE
host (No default value)
html FALSE
xml FALSE
line-numbers TRUE
unbuffered FALSE
column-names TRUE
sigint-ignore FALSE
port 3306
prompt \N [\d]>
quick FALSE
raw FALSE
reconnect TRUE
socket /var/run/mysqld/mysqld.sock
ssl FALSE
ssl-ca (No default value)
ssl-capath (No default value)
ssl-cert (No default value)
ssl-cipher (No default value)
ssl-key (No default value)
ssl-verify-server-cert FALSE
table FALSE
user (No default value)
safe-updates FALSE
i-am-a-dummy FALSE
connect_timeout 0
max_allowed_packet 16777216
net_buffer_length 16384
select_limit 1000
max_join_size 1000000
secure-auth FALSE
show-warnings FALSE
<</fixed>>
The output you get when running the above may differ depending on any customizations you may have in your local my.cnf file.
== The <<code>>mysql_history<</code>> File
On Unix, the mysql client writes a record of executed statements to a history
file. By default, this file is named .mysql_history and is created in your home
directory. To specify a different file, set the value of the MYSQL_HISTFILE
environment variable.
The .mysql_history should be protected with a restrictive access mode because
sensitive information might be written to it, such as the text of SQL
statements that contain passwords. See Section 5.3.2.2, “End-User Guidelines
for Password Security”.
If you do not want to maintain a history file, first remove .mysql_history if
it exists, and then use either of the following techniques:
* Set the MYSQL_HISTFILE variable to /dev/null. To cause this setting to take
effect each time you log in, put the setting in one of your shell's startup
files.
* Create .mysql_history as a symbolic link to /dev/null:<<code lang=sh inline=false>>
shell> ln -s /dev/null $HOME/.mysql_history
<</code>>
You need do this only once.
== <<code>>mysql<</code>> Tips
This section describes some techniques that can help you use
<<fixed>>**mysql**<</fixed>> more effectively.
=== Displaying Query Results Vertically
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:
<<code>>
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: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I´ll put this on my
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)
<</code>>
=== Using the <<fixed>>--safe-updates<</fixed>> Option
For beginners, a useful startup option is <<fixed>>--safe-updates<</fixed>> (or
<<fixed>>--i-am-a-dummy<</fixed>>, which has the same effect). It is helpful
for cases when you might have issued a
'<<fixed>>DELETE FROM tbl_name<</fixed>>' statement but forgotten the
<<fixed>>WHERE<</fixed>> clause. Normally, such a statement deletes all rows
from the table. With <<fixed>>--safe-updates<</fixed>>, you can delete rows
only by specifying the key values that identify them. This helps prevent
accidents.
When you use the <<fixed>>--safe-updates<</fixed>> option, mysql issues the
following statement when it connects to the MySQL server:
<<code lang=mysql inline=false>>
SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;
<</code>>
The <<code>>SET<</code>> statement has the following effects:
* You are not allowed to execute an UPDATE or DELETE statement unless you
specify a key constraint in the WHERE clause or provide a LIMIT clause (or
both). For example: <<code lang=mysql inline=false>>
UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
UPDATE tbl_name SET not_key_column=val LIMIT 1;
<</code>>
* The server limits all large <<fixed>>SELECT<</fixed>> results to 1,000 rows
unless the statement includes a <<fixed>>LIMIT<</fixed>> clause.
* The server aborts multiple-table <<fixed>>SELECT<</fixed>> statements that
probably need to examine more than 1,000,000 row combinations.
To specify limits different from 1,000 and 1,000,000, you can override the
defaults by using the <<fixed>>--select_limit<</fixed>> and
<<fixed>>--max_join_size<</fixed>> options:
<<fixed>>
shell> **mysql --safe-updates --select_limit=//500// --max_join_size=//10000//**
<</fixed>>
=== Disabling mysql Auto-Reconnect
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:
<<code>>
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)
<</code>>
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 <<fixed>>--skip-reconnect<</fixed>> option.