本节提供关于更有效使用的技术的信息mysql和mysql操作行为。
mysql支持输入行编辑,这使您能够原地修改当前输入行或收回以前的输入行。例如,左箭头而且右箭头键在当前输入行内水平移动,而向上箭头而且向下箭头键在前面输入的行集合中上下移动。退格删除光标之前的字符,并输入新字符,将它们输入到光标位置。按进入线路输入.
在Windows上,编辑键序列与控制台窗口中支持的命令编辑相同。在Unix上,键序列取决于用于构建的输入库mysql(例如,
libedit
或readline
库)。10bet官方网站的文档
libedit
而且readline
图书馆可以在网上找到。若要更改给定输入库所允许的键序列集,请在库启动文件中定义键绑定。这是你主目录下的一个文件:.editrc
为libedit
而且.inputrc
为readline
.例如,在
libedit
,控制+ W删除当前光标位置和之前的所有内容控制+ U删除整行。在readline
,控制+ W删除光标和之前的单词控制+ U删除当前光标位置之前的所有内容。如果mysql是用libedit
的用户readline
这两个键的行为可以将以下行放入.editrc
文件(如果需要,创建文件):绑定“^W”vi-kill-line-prev
要查看当前的键绑定集,请暂时放置一行表示only的代码
绑定
最后.editrc
.mysql在启动时显示绑定。禁用交互历史记录
的向上箭头键使您能够从当前和以前的会话中召回输入行。在共享控制台的情况下,这种行为可能不合适。mysql支持部分或完全禁用交互历史记录,这取决于主机平台。
在Windows上,历史记录存储在内存中。Alt + F7删除存储在内存中的当前历史缓冲区的所有输入行。它还删除与显示的输入行前面的顺序数字列表F7和召回(按号码)F9.按下键后输入的新输入行Alt + F7重新填充当前历史缓冲区。清除缓冲区不会阻止登录到Windows事件查看器,如果
——syslog
选项用于启动mysql.关闭控制台窗口还会清除当前历史缓冲区。要禁用Unix上的交互历史,首先要删除
.mysql_history
文件,如果它存在(否则将召回之前的条目)。然后开始mysql与——histignore =“*”
选项忽略所有新的输入行。要重新启用召回(和日志记录)行为,请重新启动mysql没有选项。如果你预防
.mysql_history
文件不被创建(参见——histignore =“*”开始mysql在客户端中,交互式历史回忆功能被完全禁用。或者,如果您省略——histignore
选项,您可以召回在当前会话期间输入的输入行。Windows上的Unicode支持
Windows提供了基于UTF-16LE的api,用于对控制台进行读写;的mysqlWindows客户端能够使用这些api。Windows安装程序在MySQL菜单中创建一个名为
MySQL命令行客户端- Unicode
.此项调用mysql客户端,属性设置为通过控制台使用Unicode与MySQL服务器通信。若要手动利用此支持,请运行mysql在使用兼容的Unicode字体的控制台中,并将默认字符集设置为与服务器通信所支持的Unicode字符集:
打开控制台窗口。
转到控制台窗口属性,选择字体选项卡,并选择Lucida console或其他兼容的Unicode字体。这是必要的,因为控制台窗口默认使用DOS光栅字体启动,这对Unicode来说是不够的。
执行mysql.exe与
——default-character-set = utf8
(或utf8mb4
)选项。这个选项是必要的,因为utf16le
是不能用作客户端字符集的字符集之一。看到mysql使用Windows api使用UTF-16LE与控制台通信,使用UTF-8与服务器通信。(前面提到的菜单项设置刚才描述的字体和字符集。)每次跑步时避免这些步骤mysql,您可以创建一个调用mysql.exe.快捷方式应该将控制台字体设置为Lucida console或其他兼容的Unicode字体,并传递
——default-character-set = utf8
(或utf8mb4
)选项mysql.exe.或者,创建一个仅设置控制台字体的快捷方式,并设置控件中的字符集
(mysql)
你的小组my.ini
文件:(mysql) default-character-set = utf8
垂直显示查询结果
有些查询结果在垂直显示时比通常的水平表格式可读性强得多。通过使用\G而不是分号来结束查询,可以垂直显示查询。例如,包含换行符的较长的文本值通常在垂直输出时更容易阅读:
从邮件mysql > SELECT *长度(txt) < 300上限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"
sbj: UTF-8 txt: >>>>> "John" == John Smith writes: John> Hi。我认为这是个好主意。有人熟悉John>的UTF-8或Unicode吗?否则,我会把它放在我的约翰>待办事项清单上,看看会发生什么。是的,请这么做。Regards, Jones文件:收件箱-jani-1 hash: 190402944 1 row in set(0.09秒) 使用安全更新模式(——Safe-Updates)
对于初学者,一个有用的启动选项是
——safe-updates
(或——i-am-a-dummy
,效果相同)。安全更新模式对于您可能发出更新
或删除
但是忘记了在哪里
子句,指示要修改的行。通常,这类语句更新或删除表中的所有行。与——safe-updates
,您只能通过指定标识行的键值来修改行限制
从句,或者两者都有。这有助于防止事故发生。安全更新模式也有限制选择
产生(或估计产生)非常大的结果集的语句。的
——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;
的
集
语句对语句处理的影响如下:启用
sql_safe_updates
原因更新
而且删除
控件中未指定键约束的语句将产生错误在哪里
条款,或提供一个限制
从句,或者两者都有。例如:更新tbl_name集not_key_column=瓦尔在哪里key_column=瓦尔;更新tbl_name集not_key_column=瓦尔限制1;
设置
sql_select_limit
到1000会导致服务器限制所有选择
结果设置为1,000行,除非语句包含限制
条款。设置
max_join_size
到1,000,000导致多表选择
语句来产生错误,如果服务器估计它必须检查超过1,000,000个行组合。
要指定不同于1,000和1,000,000的结果集限制,可以使用
——select-limit
而且——max-join-size
调用时的选项mysql:Mysql——safe-updates——select-limit=500——max-join-size=10000
这是可能的
更新
而且删除
方法中指定的键也会在安全更新模式下产生错误在哪里
子句,如果优化器决定不在键列上使用索引:方法所允许的内存使用量,则不能使用索引上的范围访问
range_optimizer_max_mem_size
系统变量。然后优化器返回到表扫描。看到如果键比较需要类型转换,则不能使用索引(参见c1是用来比较数值的吗
WHERE c1 = 2222
.对于这种比较,字符串值被转换为一个数字,操作数被数字地比较(参见解释
与更新
而且删除
语句不会产生安全更新错误。这样就可以使用解释
+显示警告
查看索引不使用的原因,这在类的情况下很有帮助range_optimizer_max_mem_size
控件中指定了键列,但会发生违反或类型转换,并且优化器不使用索引在哪里
条款。当发生安全更新错误时,错误消息包括生成的第一个诊断信息,以提供有关失败原因的信息。例如,该消息可能指示
range_optimizer_max_mem_size
值超出或发生了类型转换,这两种情况都可能导致无法使用索引。对于多表的删除和更新,只有当任何目标表使用表扫描时,才会在启用安全更新时产生错误。
禁用mysql自动连接功能
如果mysql客户端在发送一条语句时失去与服务器的连接,它会立即自动尝试重新连接一次服务器并再次发送该语句。然而,即使mysql如果重新连接成功,则第一个连接已经结束,所有以前的会话对象和设置都丢失了:临时表、自动提交模式、用户定义变量和会话变量。此外,任何当前事务都将回滚。这种行为对你来说可能是危险的,就像下面的例子中,在你不知道的情况下,服务器在第一条和第二条语句之间关闭并重新启动:
mysql> SET @a=1;查询OK, 0行影响(0.05秒)mysql> INSERT INTO t VALUES(@a);MySQL服务器已经离开没有连接。试图重新联系…连接id: 1当前数据库:test查询OK, 1 row affected (1.30 sec) mysql> SELECT * FROM t;+------+ | 一个 | +------+ | 零 | +------+ 1行集(0.05秒)
的
@a
用户变量在连接时丢失,在重新连接后它是未定义的。如果它是重要的拥有mysql如果连接已丢失,则终止并出现错误,您可以启动mysql客户端与——skip-reconnect
选择。有关自动重新连接及其在重新连接时对状态信息的影响的详细信息,请参见自动重连控制.
mysql客户端解析器与服务器解析器
的mysql类所使用的完整解析器的副本mysqld服务器端的服务器。这可能导致在处理某些构念时的差异。例子:
服务器解析器处理由
"
字符作为标识符,而不是作为普通字符串ANSI_QUOTES
启用SQL模式。的mysql客户机解析器不接受
ANSI_QUOTES
SQL模式进入帐户。它处理由。分隔的字符串"
,'
,`
字符相同,不论是否ANSI_QUOTES
启用。在
/ * !...* /
而且/ * +……* /
评论,mysql客户端解析器解释短格式mysql命令。服务器解析器不解释它们,因为这些命令在服务器端没有意义。如果需要的话mysql不解释注释中的短格式命令,部分解决方法是使用
——二进制模式
选项,这将导致所有mysql要禁用的命令除了\ C
而且\ d
在非交互模式下(用于管道的输入mysql或使用源
命令)。