4.5.1.6 mysqlClient 端提示
本节提供有关更有效使用mysql的技术和有关mysql操作行为的信息。
Input-Line Editing
mysql支持 Importing 行编辑,使您可以就地修改当前 Importing 行或调用以前的 Importing 行。例如, 左箭头 和 右箭头 键在当前 Importing 行中水平移动, 上箭头 和 向下箭头 键向上和向下移动通过一组先前 Importing 的行。退格键 删除光标之前的字符,并键入新字符将其 Importing 到光标位置.要 Importing 该行,请按 Enter **。
在 Windows 上,编辑键序列与控制台窗口中的命令编辑支持的序列相同。在 Unix 上,键序列取决于用于构建mysql的 Importing 库(例如libedit
或readline
库)。
libedit
和readline
库的文档可在线获得。要更改给定 Importing 库允许的键序列集,请在库启动文件中定义键绑定。这是您主目录中的文件:.editrc
table 示libedit
,.inputrc
table 示readline
。
例如,在libedit
中, Control W 会删除当前光标位置之前的所有内容, **** U 会删除整行.在readline
中, Control W 删除光标之前的单词, U 删除当前光标位置之前的所有内容。如果mysql是使用libedit
构建的,则对这两个键更喜欢readline
行为的用户可以在.editrc
文件中放置以下行(如果需要,可以创建文件):
bind "^W" ed-delete-prev-word
bind "^U" vi-kill-line-prev
要查看当前的键绑定集,请在.editrc
的末尾临时放置一行仅 table 示bind
的行。 mysql启动时将显示绑定。
禁用互动历史记录
向上箭头键使您能够从当前和先前的会话中调出 Importing 行。在共享控制台的情况下,此行为可能不合适。 mysql支持部分或全部禁用交互式历史记录,具体取决于主机平台。
在 Windows 上,历史记录存储在内存中。 Alt F7 删除当前历史记录缓冲区中存储在存储器中的所有 Importing 行。它还删除用 F7 显示并用 F9 调用(按数字)的 Importing 行前面的序列号列 table。在按 Alt F7 后 Importing 的新 Importing 行将重新填充当前历史记录缓冲区。如果使用--syslog选项启动mysql,则清除缓冲区不会阻止登录到 Windows Event Viewer。关闭控制台窗口也会清除当前历史记录缓冲区。
要在 Unix 上禁用交互式历史记录,请首先删除.mysql_history
文件(如果存在)(否则将调用以前的条目)。然后以--histignore="*"
选项开始mysql以忽略所有新的 Importing 行。要重新启用撤回(和记录)行为,请在不使用该选项的情况下重新启动mysql。
如果您阻止创建.mysql_history
文件(请参见控制历史记录文件)并使用--histignore="*"
启动mysqlClient 端,则交互式历史记录调用功能将完全禁用。或者,如果省略--histignore选项,则可以调用在当前会话期间 Importing 的 Importing 行。
Windows 上的 Unicode 支持
Windows 提供了基于 UTF-16LE 的 API 来读取和写入控制台。 Windows 的mysqlClient 端可以使用这些 API。 Windows 安装程序在 MySQL 菜单中创建名为MySQL command line client - Unicode
的项目。此项会调用mysqlClient 端(其属性设置为使用 Unicode 通过控制台与 MySQL 服务器通信)。
要手动利用此支持,请在使用兼容 Unicode 字体的控制台中运行mysql,并将默认字符集设置为支持与服务器通信的 Unicode 字符集:
-
打开控制台窗口。
-
转到控制台窗口属性,选择字体选项卡,然后选择 Lucida Console 或其他兼容的 Unicode 字体。这是必需的,因为默认情况下控制台窗口是使用 Unicode 不足的 DOS 栅格字体启动的。
-
使用--default-character-set=utf8(或
utf8mb4
)选项执行mysql.exe。此选项是必需的,因为utf16le
是不能用作 Client 端字符集的字符集之一。参见不允许的 Client 字符集。
进行这些更改后,mysql将使用 Windows API 使用 UTF-16LE 与控制台进行通信,并使用 UTF-8 与服务器进行通信。 (前面提到的菜单项如上所述设置字体和字符集.)
为了避免每次运行mysql时都执行这些步骤,可以创建调用mysql.exe的快捷方式。快捷方式应将控制台字体设置为 Lucida Console 或其他兼容的 Unicode 字体,并将--default-character-set=utf8(或utf8mb4
)选项传递给mysql.exe。
或者,创建仅设置控制台字体的快捷方式,然后在my.ini
文件的[mysql]
组中设置字符集:
[mysql]
default-character-set=utf8
垂直显示查询结果
垂直显示而不是通常的水平 table 格格式时,某些查询结果更具可读性。通过用\ 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: [email protected]
mail_to: "John Smith" <[email protected]>
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)
使用安全更新模式(-安全更新)
对于 Starters,有用的启动选项是--safe-updates(或--i-am-a-dummy,具有相同的效果)。对于您可能已发出UPDATE或DELETE语句但忘记了WHERE
子句(指示要修改的行)的情况,安全更新模式很有用。通常,此类语句会更新或删除 table 中的所有行。使用--safe-updates,您只能通过指定标识它们的键值或LIMIT
子句或两者来修改行。这有助于防止事故发生。安全更新模式还限制产生(或估计产生)非常大的结果集的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设置为 1,000 将导致服务器将所有SELECT结果集限制为 1,000 行,除非该语句包含
LIMIT
子句。 -
如果服务器估计必须检查超过 1,000,000 行组合,则将max_join_size设置为 1,000,000 会导致多 tableSELECT语句产生错误。
要指定结果集限制(不同于 1,000 和 1,000,000),可以在调用mysql时使用--select-limit和--max-join-size选项覆盖默认值:
mysql --safe-updates --select-limit=500 --max-join-size=10000
如果优化程序决定不使用键列上的索引,即使使用WHERE
子句中指定的键,UPDATE和DELETE语句也有可能在安全更新模式下产生错误:
-
如果内存使用量超出了range_optimizer_max_mem_size系统变量所允许的范围,则无法使用索引上的范围访问。然后,优化器回退到 table 扫描。参见限制内存使用以进行范围优化。
-
如果键比较需要类型转换,则可能不使用索引(请参见第 8.3.1 节“ MySQL 如何使用索引”)。假设使用
WHERE c1 = 2222
将索引的字符串列c1
与数值进行比较。对于此类比较,将字符串值转换为数字,并对操作数进行数字比较(请参见第 12.2 节“table 达式评估中的类型转换”),从而避免使用索引。如果启用了安全更新模式,则会发生错误。
从 MySQL 5.7.25 开始,安全更新模式还包含以下行为:
-
EXPLAIN和UPDATE和DELETE语句不会产生安全更新错误。这样可以使用EXPLAIN加SHOW WARNINGS来查看为什么不使用索引,这在发生range_optimizer_max_mem_size违例或类型转换并且即使
WHERE
中指定了键列的情况下优化器也不使用索引的情况下很有用。条款。 -
当发生安全更新错误时,错误消息将包含所产生的第一个诊断,以提供有关失败原因的信息。例如,该消息可能指示超出了range_optimizer_max_mem_size值或发生了类型转换,这两种情况都可能会阻止使用索引。
-
对于多 table 删除和更新,仅当任何目标 table 使用 table 扫描时,才启用安全更新会产生错误。
禁用 mysql 自动重新连接
如果mysqlClient 端在发送语句时失去与服务器的连接,它将立即自动尝试重新连接到服务器一次并再次发送该语句。但是,即使mysql重新连接成功,您的第一个连接也已结束,并且之前的所有会话对象和设置都将丢失:临时 table,自动提交模式以及用户定义的会话变量。同样,任何当前事务都会回滚。此行为对您可能很危险,如以下示例所示,在您不知道的情况下在第一条和第二条语句之间关闭并重新启动服务器:
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终止并终止错误很重要,则可以使用--skip-reconnect选项启动mysqlClient 端。
有关自动重新连接及其在重新连接时对状态信息的影响的更多信息,请参见第 27.7.19 节“ C API 自动重新连接控制”。
mysqlClient 端解析器与服务器解析器
mysqlClient 端在 Client 端使用解析器,而不是服务器mysqld服务器使用的完整解析器的副本。这可能导致某些构造物的处理差异。例子:
- 如果启用了ANSI_QUOTES SQL 模式,则服务器解析器会将以
"
个字符分隔的字符串视为标识符,而不是纯字符串。
mysqlClient 端解析器未考虑ANSI_QUOTES
SQL 模式。无论是否启用了ANSI_QUOTES,它都将以"
,'
和```''字符分隔的字符串视为相同。
如果希望mysql不解释 Comments 中的短格式命令,则部分解决方法是使用--binary-mode选项,这会导致除\C
和\d
以外的所有mysql命令被禁用(在非交互模式下(对于通过管道传递到mysql的 Importing 或使用source
命令)。