mysql是一个简单的SQL shell,具有输入行编辑功能。它支持交互式和非交互式使用。交互使用时,查询结果以ASCII表格式显示。当非交互使用时(例如,作为过滤器),结果以制表符分隔的格式显示。可以使用命令选项更改输出格式。
如果由于内存不足而导致大型结果集出现问题,请使用--quick选项。这迫使mysql一次从服务器检索一行结果,而不是检索整个结果集并在显示之前将其缓冲在内存中。这是通过使用客户机/服务器库中的mysql_use_result()C API函数而不是mysql_store_result)返回结果集来完成的。
注意:
MySQL Shell提供对X DevAPI的访问。
使用mysql非常容易。可以从命令解释器的提示中调用它,如下所示:
mysql db_name
或者:
mysql --user=user_name --password db_name
在这种情况下,您需要输入密码以响应mysql显示的提示:
Enter password: your_password
然后键入一条SQL语句,以;,\g、 或\G结尾;然后按Enter键。
键入Control+C会中断当前语句(如果有),或者取消任何部分输入行。
您可以在脚本文件(批处理文件)中执行SQL语句,如下所示:
mysql db_name < script.sql > output.tab
在Unix上,mysql客户端将交互执行的语句记录到历史文件中。
mysql支持以下选项,这些选项可以在命令行上指定,也可以在选项文件的[mysql]和[client]组中指定。
显示帮助消息并退出。
启用MySQL命令行客户端中自动重哈希(automatic rehashing)的功能。默认情况下,自动重哈希是启用的,它允许数据库、表和列名的自动补全。如果出于某些原因您想要禁用自动重哈希以加快启动速度,您可以使用--disable-auto-rehash
选项。
但是,请注意,从MySQL 5.7.7开始,--disable-auto-rehash
选项已经被废弃(deprecated),并且在MySQL 8.0及以后的版本中已被移除。取而代之的是,自动补全功能默认总是开启的,而无需使用任何特定的命令行选项。
如果您正在使用MySQL 8.0或更高版本,并且想要管理自动补全的行为,那么通常您不需要(也不能)通过命令行选项来禁用它。但是,您可以通过输入\#
(井号)或rehash
命令来手动触发名称哈希的更新,特别是在您添加了新的数据库、表或列之后。
要在命令行中补全名称,只需输入名称的前几个字符,然后按下Tab键。如果名称是唯一的,MySQL将自动补全它。如果不是唯一的,再次按下Tab键将显示以您已输入内容开头的所有可能名称。请注意,如果没有默认数据库,则不会发生补全。
自动补全(auto-completion)和命令行编辑功能(如历史记录和行编辑)通常依赖于readline
库,但readline
库主要是为Unix和类Unix系统(如Linux和macOS)设计的,并不直接支持Windows。
在MySQL命令行客户端中,当结果集太宽以至于无法在当前窗口宽度内水平显示时,可以使用特定的设置来使结果集以垂直格式显示。默认情况下,MySQL使用水平表格格式来显示查询结果,但如果你希望结果集在过宽时自动转换为垂直格式,你可以通过调整客户端的设置来实现。
不过,MySQL的默认命令行客户端并没有直接的命令行选项来设置这种自动切换。但是,你可以使用\G
(大写G)作为查询的终止符来强制MySQL以垂直格式显示结果,即使结果集可以在水平方向上显示。
使用制表符作为列分隔符打印结果,并且每行都在新的一行上。有了这个选项,mysql就不会使用历史文件。
批处理模式会导致非特殊的输出格式和特殊字符的转义。
如果给定此选项,mysql将使用十六进制表示法(0xvalue)显示二进制数据。无论整体输出显示格式是表格格式、垂直格式、HTML还是XML,都会发生这种情况。
当使用 --binary-as-hex
选项时,MySQL 命令行客户端会将所有的二进制字符串显示为十六进制形式,包括那些由如 CHAR()
和 UNHEX()
等函数返回的二进制字符串。这个选项主要用于调试和诊断目的,以便更容易地看到二进制数据的实际内容。
以下是一个使用 ASCII 码 A
(十进制为 65,十六进制为 41)的示例,来演示 --binary-as-hex
选项的效果:
-
mysql> SELECT CHAR(0x41), UNHEX('41');
+------------+-------------+
| CHAR(0x41) | UNHEX('41') |
+------------+-------------+
| A | A |
+------------+-------------+
首先,你需要以包含 --binary-as-hex
选项的方式启动 MySQL 命令行客户端。但请注意,这个选项通常不能在已经运行的客户端会话中动态更改;你需要重新启动客户端并带上这个选项。
假设你以如下方式启动了客户端:
mysql --binary-as-hex -u your_username -p
然后执行相同的查询:
mysql> SELECT CHAR(0x41), UNHEX('41');
+------------------------+--------------------------+
| CHAR(0x41) | UNHEX('41') |
+------------------------+--------------------------+
| 0x41 | 0x41 |
+------------------------+--------------------------+
如果你想要在MySQL中无论是否启用了--binary-as-hex
选项都将二进制数据以字符形式显示,你可以使用CHAR()
函数配合USING
子句来指定一个字符集。
CHAR()
函数在 MySQL 中有一个可选的USING charset
子句
CHAR()
函数用于将整数序列转换为字符序列。当你有一个二进制字符串(例如,一个BLOB
列或BINARY
类型的数据)并希望将其视为字符数据时,你可以使用CHAR()
函数。而USING
子句允许你指定一个字符集,这样MySQL就知道如何解释这些字节作为字符。
mysql> SELECT CHAR(0x41 USING utf8mb4);
+--------------------------+
| CHAR(0x41 USING utf8mb4) |
+--------------------------+
| A |
+--------------------------+
- 更一般地,如果你想要将一个表达式转换为特定的字符集,你可以使用 MySQL 的
CONVERT()
函数。
CONVERT()
函数允许你转换数据类型和数据编码,它有两个参数:要转换的表达式和要转换到的字符集。
mysql> SELECT CONVERT(UNHEX('41') USING utf8mb4);
+------------------------------------+
| CONVERT(UNHEX('41') USING utf8mb4) |
+------------------------------------+
| A |
+------------------------------------+
在 MySQL 8.0.19 及以后的版本中,当 MySQL 以交互式模式运行时,--binary-as-hex
选项默认是启用的。这意味着,默认情况下,MySQL 会将二进制数据以十六进制格式显示。
当你运行 status
(或简写为 \s
)命令时,如果 --binary-as-hex
选项是隐式或显式启用的,输出中将会包含与这个选项相关的行。这通常是为了向用户指示二进制数据是以十六进制格式显示的。
Binary data as: Hexadecimal
如果您想要在 MySQL 命令行客户端中禁用二进制数据以十六进制形式显示,可以使用 --skip-binary-as-hex
选项。
--binary-mode
选项在处理 mysqlbinlog
的输出时特别有用,因为 mysqlbinlog
通常用于查看或处理 MySQL 的二进制日志(binlog),这些日志可能包含 BLOB
值。
默认情况下,MySQL 在处理 SQL 语句字符串时,会将 \r\n
(回车加换行)转换为 \n
(换行),并将 \0
(空字符)解释为语句的终止符。
在 MySQL 客户端的非交互式模式下(即当通过管道(pipe)将输入传递给 mysql
客户端或使用 source
命令加载 SQL 文件时),--binary-mode
选项会禁用除了 charset
和 delimiter
之外的所有 MySQL 命令。
这是因为非交互式模式下,mysql
客户端通常被用来处理来自文件或其他命令的预定义输入,这些输入可能包含二进制数据。在这种情况下,保持数据的原样并避免任何可能的解释或转换是非常重要的。
在具有多个网络接口的计算机上,使用此选项可以选择用于连接MySQL服务器的接口。
安装字符集的目录。
在结果中写入列名。
显示结果集元数据。此信息对应于C API MYSQL_FIELD数据结构的内容。
--comments
和 --skip-comments
用于控制发送到 MySQL 服务器的 SQL 语句中是否保留或剥离注释。默认情况下,mysql
客户端使用 --skip-comments
选项,这意味着它会剥离 SQL 语句中的注释。如果您想保留注释,可以使用 --comments
选项。
注:
mysql
客户端总是将优化器提示(optimizer hints)传递给服务器,无论是否给出这些选项。- MySQL 客户端中剥离注释(comment stripping)的功能已被弃用,并且在未来某个 MySQL 版本中,这个特性及其相关的控制选项(如
--comments
和--skip-comments
)可能会被移除。
如果可能,压缩所有在客户端和服务器之间发送的信息。
从 MySQL 8.0.18 开始,--compress
选项在 MySQL 客户端命令行工具中已被弃用(deprecated),并可能在未来的 MySQL 版本中被移除。这是因为 MySQL 客户端现在默认使用更加高效的通信协议和加密方法,这通常不再需要显式启用压缩。
在 MySQL 中,对于连接到服务器的连接,可以指定允许的压缩算法。这些算法与 protocol_compression_algorithms
系统变量的可用算法相同。其默认值是 'uncompressed'
,表示不使用压缩。
此选项是在MySQL 8.0.18中添加的。
在 MySQL 中,如果用于连接的账户密码已过期,通常服务器会断开非交互式客户端的连接。但是,在某些情况下,您可能希望即使密码过期也能让非交互式客户端(如脚本或自动化工具)继续执行操作。为此,MySQL 8.0 引入了"沙箱模式"(sandbox mode)的概念,它允许客户端在密码过期的情况下继续执行操作,但仅限于只读操作。
连接超时的秒数(默认值为0)。
要使用的数据库。这主要在选项文件中很有用。
编写调试日志。一个典型的debug_options字符串是d:t:o,file_name。默认值为d:t:o,/tmp/mysql.trace。
只有使用WITH_DEBUG构建MySQL时,此选项才可用。Oracle提供的MySQL版本二进制文件不是使用此选项构建的。
当程序退出时,打印调试信息以及内存和CPU使用情况统计信息。
只有使用WITH_DEBUG构建MySQL时,此选项才可用。Oracle提供的MySQL版本二进制文件不是使用此选项构建的。
关于使用哪个客户端身份验证插件的提示。
使用charset_name作为客户端和连接的默认字符集。
如果操作系统使用一个字符集,而mysql客户端默认使用另一个,则此选项非常有用。在这种情况下,输出的格式可能不正确。通常可以通过使用此选项强制客户端使用系统字符集来解决此类问题。