Mysql - MySQL命令行客户端
mysql是一个具有输入行编辑功能的简单SQL shell。它支持交互式和非交互式使用。当以交互方式使用时,查询结果以ASCII表格格式呈现。当以非交互方式使用(例如作为过滤器)时,结果以制表符分隔的格式呈现。输出格式可以通过命令选项进行更改。
如果您由于大型结果集的内存不足而遇到问题,请使用–quick选项。这会强制mysql一次从服务器检索一行结果,而不是先检索整个结果集并将其缓冲到内存中再显示。这是通过在客户端/服务器库中使用mysql_use_result() C API函数而不是mysql_store_result()来返回结果集来实现的。
使用mysql非常简单。从命令解释器的提示符中调用它,如下所示:
mysql db_name
或者:
mysql --user=user_name --password db_name
在这种情况下,您需要根据mysql显示的提示输入密码:
Enter password: your_password
然后输入一个SQL语句,以分号、。
如果存在当前语句,则通过按Control+C中断该语句,否则取消任何部分输入行。
您可以像这样在脚本文件(批处理文件)中执行SQL语句:
mysql db_name < script.sql > output.tab
在Unix上,mysql客户端将交互执行的语句记录到历史文件中。
OptionName | Description |
---|---|
–auto-rehash | 启用自动重新哈希 |
–auto-vertical-output | 启用自动垂直结果集显示 |
–batch | 不使用历史文件 |
–binary-as-hex | 以十六进制表示法显示二进制值 |
–binary-mode | 禁用 ‘’ - 到 -‘’ 的转换和将 ‘\0’ 视为查询结束的处理 |
–bind-address | 使用指定的网络接口连接到MySQL服务器 |
–character-sets-dir | 安装字符集的目录 |
–column-names | 在结果中写入列名 |
–column-type-info | 显示结果集元数据 |
–comments | 是否保留或删除发送到服务器的语句中的注释 |
–compress | 压缩客户端和服务器之间发送的所有信息 |
–compression-algorithms | 允许的连接服务器的压缩算法 |
–connect-expired-password | 指示服务器客户端可以处理过期密码沙箱模式 |
–connect-timeout | 连接超时之前的秒数 |
–database | 要使用的数据库 |
–debug | 写入调试日志;仅在MySQL构建了调试支持时才支持 |
–debug-check | 程序退出时打印调试信息 |
–debug-info | 程序退出时打印调试信息、内存和CPU统计信息 |
–default-auth | 要使用的认证插件 |
–default-character-set | 指定默认字符集 |
–defaults-extra-file | 除了通常的选项文件之外,还读取命名选项文件 |
–defaults-file | 只读取命名选项文件 |
–defaults-group-suffix | 选项组后缀值 |
–delimiter | 设置语句分隔符 |
–dns-srv-name | 使用DNS SRV查找主机信息 |
–enable-cleartext-plugin | 启用明文认证插件 |
–execute | 执行语句并退出 |
–fido-register-factor | 必须进行注册的多因素认证因素 |
–force | 即使发生SQL错误也继续 |
–get-server-public-key | 从服务器请求RSA公钥 |
–help | 显示帮助消息并退出 |
–histignore | 指定用于记录日志的语句的模式 |
–host | MySQL服务器所在的主机 |
–html | 生成HTML输出 |
–ignore-spaces | 忽略函数名称后的空格 |
–init-command | 连接后执行的SQL语句 |
–line-numbers | 为错误写入行号 |
–load-data-local-dir | LOAD DATA LOCAL语句中命名的文件的目录 |
–local-infile | 启用或禁用LOAD DATA的本地功能 |
–login-path | 从.mylogin.cnf读取登录路径选项 |
–max-allowed-packet | 发送到或从服务器的最大数据包长度 |
–max-join-size | 在使用 –safe-updates 时,连接时的自动限制行数 |
–named-commands | 启用命名mysql命令 |
–net-buffer-length | TCP/IP和套接字通信的缓冲区大小 |
–network-namespace | 指定网络命名空间 |
–no-auto-rehash | 禁用自动重新哈希 |
–no-beep | 发生错误时不发出蜂鸣声 |
–no-defaults | 不读取任何选项文件 |
–oci-config-file | 定义Oracle Cloud Infrastructure CLI配置文件的替代位置。 |
–one-database | 忽略除命令行上指定的默认数据库之外的语句 |
–pager | 使用给定的命令进行分页查询输出 |
–password | 连接服务器时使用的密码 |
–password1 | 连接服务器时使用的第一种多因素认证密码 |
–password2 | 连接服务器时使用的第二种多因素认证密码 |
–password3 | 连接服务器时使用的第三种多因素认证密码 |
–pipe | 使用命名管道(仅限Windows)连接服务器 |
–plugin-authentication-kerberos-client-mode | 在Windows上通过MIT Kerberos库允许GSSAPI可插拔身份验证 |
–plugin-dir | 安装插件的目录 |
–port | 连接的TCP/IP端口号 |
–print-defaults | 打印默认选项 |
–prompt | 将提示设置为指定的格式 |
–protocol | 要使用的传输协议 |
–quick | 不缓存每个查询结果 |
–raw | 在写入列值时不进行转义转换 |
–reconnect | 如果与服务器的连接丢失,则自动尝试重新连接 |
–safe-updates, –i-am-a-dummy | 允许只有UPDATE和DELETE语句指定键值 |
–select-limit | 在使用 –safe-updates 时,SELECT语句的自动限制行数 |
–server-public-key-path | 包含RSA公钥的文件的路径名 |
–shared-memory-base-name | 共享内存连接(仅限Windows)的共享内存名称 |
–show-warnings | 如果有任何警告,在每个语句之后显示警告 |
–sigint-ignore | 忽略SIGINT信号(通常是按Control+C键的结果) |
–silent | 静默模式 |
–skip-auto-rehash | 禁用自动重新哈希 |
–skip-column-names | 在结果中不写入列名 |
–skip-line-numbers | 跳过错误的错误行号 |
–skip-named-commands | 禁用命名mysql命令 |
–skip-pager | 禁用分页 |
–ssl-ca | 包含受信任的SSL证书颁发机构列表的文件 |
–ssl-capath | 包含受信任的SSL证书颁发机构证书文件的目录 |
–ssl-cert | 包含X.509证书的文件 |
–ssl-cipher | 允许用于连接加密的密码 |
–ssl-crl | 包含证书撤销列表的文件 |
–ssl-crlpath | 包含证书撤销列表文件的目录 |
–ssl-fips-mode | 是否在客户端启用FIPS模式 |
–ssl-key | 包含X.509密钥的文件 |
–ssl-mode | 连接到服务器的期望安全状态 |
–ssl-session-data | 包含SSL会话数据的文件 |
–ssl-session-data-continue-on-failed-reuse | 如果会话重用失败,是否建立连接 |
–syslog | 将交互式语句记录到syslog |
–table | 以表格格式显示输出 |
–tee | 将输出的副本追加到指定的文件 |
–tls-ciphersuites | 加密连接允许的TLSv1.3密码套件 |
–tls-version | 加密连接允许的TLS协议 |
–unbuffered | 每查询后刷新缓冲区 |
–user | 连接到服务器时使用的MySQL用户名 |
–verbose | 详细模式 |
–version | 显示版本信息并退出 |
–vertical | 垂直打印查询输出行(每列值一行) |
–wait | 如果无法建立连接,等待并重试而不是中止 |
–xml | 生成XML输出 |
–zstd-compression-level | 对使用zstd压缩的服务器连接进行压缩的级别 |
MySQL客户端命令
mysql会将你发出的每个SQL语句发送给服务器执行。此外,mysql还解释一组命令。要查看这些命令的列表,请在mysql>提示符下输入help或
mysql> help
所有MySQL命令的列表: 注意,所有文本命令必须首先出现在一行并以分号结尾 ? (?) 等同于`help’的同义词。 clear ( 清除当前输入语句。 connect ( 重新连接到服务器。可选参数是db和host。 delimiter ( 设置语句分隔符。 edit () 使用$EDITOR编辑命令。 ego ( 将命令发送到mysql服务器,垂直显示结果。 exit () 退出mysql。与quit相同。 go () 将命令发送到mysql服务器。 help ( 显示此帮助。 nopager () 禁用分页器,将输出打印到stdout。 notee ( 不写入outfile。 pager () 设置PAGER [to_pager]。通过PAGER打印查询结果。 print () 打印当前命令。 prompt () 更改您的mysql提示符。 quit () 退出mysql。 rehash (#) 重建完成哈希。 source (.) 执行SQL脚本文件。接受一个文件名作为参数。 status () 从服务器获取状态信息。 system (!) 执行系统shell命令。 tee () 设置outfile [to_outfile]。将所有内容追加到给定的outfile中。 use ( 使用另一个数据库。接受数据库名称作为参数。 charset () 切换到另一个字符集。可能需要用于处理多字节字符集的binlog。 warnings () 在每个语句后显示警告。 nowarning () 在每个语句后不显示警告。 resetconnection() 清理会话上下文。 query_attributes 为下一个查询设置字符串参数(name1 value1 name2 value2 …)。 ssl_session_data_print 将当前SSL会话数据序列化到stdout或文件。
对于服务器端帮助,请输入’help contents’。
如果mysql使用–binary-mode选项调用,则除非交互模式下的charset和delimiter之外的所有mysql命令都将被禁用(对于输入管道到mysql或使用source命令加载的内容)。
每个命令都有长格式和短格式。长格式不区分大小写;短格式区分大小写。长格式可以跟随一个可选的分号终止符,但短格式不应该有。
在多行/* ... */
注释中使用短格式命令不受支持。短格式命令可以在单行/*! ... */
版本注释中使用,就像在对象定义中的/*+ ... */
优化器提示注释一样。如果担心优化器提示注释可能存储在对象定义中,以便在重新加载带有mysql的dump文件时导致执行这些命令,请使用–binary-mode选项调用mysql,或者使用除mysql之外的其他重新加载客户端。
mysql客户端日志
mysql客户端可以对交互式执行的语句进行以下类型的日志记录:
- 在Unix上,mysql将语句写入历史文件。默认情况下,该文件位于您的主目录中的.mysql_history。要指定不同的文件,请设置MYSQL_HISTFILE环境变量的值。
- 在所有平台上,如果给定了–syslog选项,mysql将语句写入系统日志设施。在Unix上,这是syslog;在Windows上,这是Windows事件日志。记录消息出现的位置取决于系统。在Linux上,目标通常是/var/log/messages文件。
日志记录如何发生
对于每个启用的日志目标,语句日志记录按以下方式发生:
- 仅在交互式执行时记录语句。语句是非交互式的,例如从文件或管道读取。还可以使用–batch或–execute选项抑制语句日志记录。
- 忽略与“ignore”列表中任何模式匹配的语句。
- mysql记录每个非忽略、非空语句行。
如果一个非忽略的语句跨越多行(不包括终止分隔符),mysql将行连接起来形成完整的语句,将换行符映射为空格,并记录结果,加上分隔符。
因此,跨多行的输入语句可能会被记录两次。考虑以下输入:
mysql> SELECT -> 'Today is' -> , -> CURDATE() -> ;
在这种情况下,mysql在读取它们时记录“SELECT”、“‘Today is’”、“,”、“CURDATE()”和“;”行。它还记录完整的语句,将SELECT‘Today is’,()映射为SELECT ‘Today is’ , CURDATE(),加上分隔符。因此,这些行出现在记录输出中:
SELECT 'Today is' , CURDATE() ; SELECT 'Today is' , CURDATE();
mysql忽略出于记录目的而与“ignore”列表中任何模式匹配的语句。默认情况下,模式列表为”IDENTIFIED:PASSWORD”,以忽略引用密码的语句。模式匹配不区分大小写。在模式中,两个字符是特殊的:
?匹配任何单个字符。 *匹配任何零个或多个字符序列。
要指定其他模式,请使用–histignore选项或设置MYSQL_HISTIGNORE环境变量。(如果两者都指定,选项值优先。)值应该是一个或多个由冒号分隔的模式列表,这些模式附加到默认模式列表。
命令行指定的模式可能需要用引号或转义以防止命令解释器将它们特殊对待。例如,要阻止除了引用密码的语句外的其他UPDATE和DELETE语句的日志记录,可以像这样调用mysql:
mysql --histignore="*UPDATE*:*DELETE*"
控制历史文件
.mysql_history文件应该受到限制访问模式的保护,因为敏感信息可能被写入其中,例如包含密码的SQL语句的文本。文件中的语句可以在使用向上箭头键召回历史时从mysql客户端访问。参见禁用交互式历史记录。
如果您不想维护历史文件,首先删除.mysql_history(如果存在)。然后使用以下任何一种技术防止它再次被创建:
将MYSQL_HISTFILE环境变量设置为/dev/null。要使此设置在每次登录时生效,将其放入您shell的启动文件中。
将.mysql_history作为指向/dev/null的符号链接创建;这只需要做一次:
ln -s /dev/null $HOME/.mysql_history
syslog日志记录特征
如果给定了–syslog选项,mysql将交互式语句写入系统日志设施。消息记录具有以下特征。
- 记录发生在“information”级别。这与Unix/Linux syslog能力上的LOG_INFO优先级以及Windows Event Log上的EVENTLOG_INFORMATION_TYPE相对应。查阅您的系统文档以配置您的日志能力。
- 消息大小限制为1024字节。
- 消息由标识符MysqlClient组成,后面跟着以下值:
- SYSTEM_USER
- 操作系统用户名称(登录名)或– 如果用户未知。
- MYSQL_USER
- MySQL用户名称(使用–user选项指定)或– 如果用户未知。
- CONNECTION_ID:
- 客户端连接标识符。这与会话内的CONNECTION_ID()函数值相同。
- DB_SERVER
- 服务器主机或– 如果主机未知。
- DB
- 默认数据库或– 如果没有选择数据库。
- QUERY
- 记录语句的文本。
- SYSTEM_USER
以下是在Linux上使用–syslog生成的示例输出。输出格式化以提高可读性;每个记录的消息实际上只占一行。
Mar 7 12:39:25 myhost MysqlClient[20824]: SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23, DB_SERVER:'127.0.0.1', DB:'--', QUERY:'USE test;' Mar 7 12:39:28 myhost MysqlClient[20824]: SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23, DB_SERVER:'127.0.0.1', DB:'test', QUERY:'SHOW TABLES;'
mysql客户端服务器端帮助
mysql> help search_string
如果你给help命令提供一个参数,mysql会将其作为搜索字符串来从MySQL参考手册的内容中获取服务器端帮助。这个命令的正确操作要求mysql数据库中的帮助表需要用帮助主题信息进行初始化。
如果没有找到搜索字符串的匹配项,搜索将失败:
mysql> help me 没有找到任何内容
请尝试运行’help contents’以查看所有可访问的主题 使用help contents查看帮助类别列表:
mysql> help contents 你请求了关于帮助类别:"Contents"的帮助 更多信息,请输入'help <item>',其中<item>是以下类别之一: Account Management Administration Data Definition Data Manipulation Data Types Functions Functions and Modifiers for Use with GROUP BY Geographic Features Language Structure Plugins Storage Engines Stored Routines Table Maintenance Transactions Triggers
如果搜索字符串匹配多个项目,mysql会显示匹配主题的列表:
mysql> help logs 许多请求您的帮助的项目存在。 为了做出更具体的请求,请输入'help <item>', 其中<item>是以下主题之一: SHOW SHOW BINARY LOGS SHOW ENGINE SHOW LOGS
使用主题作为搜索字符串来查看该主题的帮助条目:
mysql> help show binary logs 名称:'SHOW BINARY LOGS' 描述: 语法: SHOW BINARY LOGS SHOW MASTER LOGS
列出服务器上的二进制日志文件。此语句用于[purge-binary-logs]中描述的过程,该过程展示了如何确定哪些日志可以清除。 mysql> SHOW BINARY LOGS; +—————+———–+———–+ | Log_name | File_size | Encrypted | +—————+———–+———–+ | binlog.000015 | 724935 | Yes | | binlog.000016 | 733481 | Yes | +—————+———–+———–+
搜索字符串可以包含通配符字符 %
和 _
。这些与使用LIKE操作符进行模式匹配操作具有相同的意义。例如,HELP rep%
返回一个以rep开头的主题列表:
mysql> HELP rep% 许多请求您的帮助的项目存在。 为了做出更具体的请求,请输入'help <item>', 其中<item>是以下 主题之一: REPAIR TABLE REPEAT FUNCTION REPEAT LOOP REPLACE REPLACE FUNCTION
从文本文件中执行SQL语句
mysql客户端通常以交互方式使用,如下所示:
mysql db_name
然而,也可以将SQL语句放在一个文件中,然后告诉mysql从该文件中读取输入。要做到这一点,创建一个名为text_file的文本文件,其中包含要执行的语句。然后调用mysql,如下所示:
mysql db_name < text_file
如果在文件中将USE db_name语句作为第一个语句,则无需在命令行上指定数据库名称:
mysql < text_file
如果您已经在运行mysql,可以使用source
命令或\.
命令执行SQL脚本文件:
mysql> source file_name mysql> \. file_name
有时您可能希望脚本向用户显示进度信息。为此,可以插入类似这样的语句:
SELECT '<info_to_display>' AS ' ';
上述语句显示输出<info_to_display>。
您还可以使用–verbose选项调用mysql,这将导致每个语句在其产生的结果之前显示。
mysql会忽略输入文件开头的Unicode字节顺序标记(BOM)字符。以前,它会读取它们并将其发送到服务器,从而导致语法错误。BOM的存在不会使mysql更改其默认字符集。要更改字符集,请使用诸如–default-character-set=utf8mb4之类的选项调用mysql。
mysql客户端提示
输入行编辑
mysql支持输入行编辑,使您能够就地修改当前输入行或回顾先前输入行。例如,左箭头和右箭头在当前输入行内水平移动,上箭头和下箭头在先前输入行的集合中上下移动。退格键删除光标前的字符,输入新字符将它们输入到光标位置。要输入该行,请按Enter键。
在Windows上,编辑键序列与在控制台窗口中为命令编辑定义的键序列相同。在Unix上,键序列取决于用于构建mysql的输入库(例如,libedit或readline库)。
有关libedit和readline库的文档可在线找到。要更改给定输入库允许的键序列集,请在库启动文件中定义键绑定。这是您的主目录中的文件:.editrc用于libedit和.inputrc用于readline。
例如,在libedit中,Control+W删除光标位置之前的所有内容,Control+U删除整行。在readline中,Control+W删除光标之前的单词,Control+U删除光标位置之前的所有内容。如果mysql是用libedit构建的,用户喜欢这些两个键的readline行为,可以在.editrc文件中添加以下行(如果需要,创建该文件):
bind "^W" ed-delete-prev-word bind "^U" vi-kill-line-prev
要查看当前的键绑定集,可以暂时在.editrc末尾放置一行,仅绑定。mysql在启动时显示绑定。
禁用交互式历史记录
上箭头键使您能够从当前会话和先前会话中回忆输入行。在某些共享控制台的情况下,这种行为可能不适合。mysql支持根据主机平台部分或完全禁用交互式历史记录。
在Windows上,历史记录存储在内存中。Alt+F7删除当前历史缓冲区中存储的所有输入行。它还删除显示在按F7和按F9召回(按数字)的输入行前面的序列号列表。按下Alt+F7后输入的新行重新填充当前历史缓冲区。清除缓冲区不会阻止使用–syslog选项启动mysql的Windows事件查看器日志记录。关闭控制台窗口也会清除当前历史缓冲区。
要在Unix上禁用交互式历史记录,首先删除.mysql_history文件(如果存在),否则将回忆以前的条目。然后使用--histignore="*"
选项启动mysql以忽略所有新输入行。要重新启用回忆(和日志记录)行为,重新启动mysql而不使用该选项。
如果您阻止.mysql_history文件被创建(参见控制历史文件),并使用–histignore=“*“启动mysql客户端,则完全禁用了交互式历史记录回忆功能。或者,如果您省略–histignore选项,您可以回忆当前会话中输入的行。
在Windows上支持Unicode
Windows提供了基于UTF-16LE的API来读取和写入控制台;mysql客户端的Windows版本能够使用这些API。Windows安装程序在MySQL菜单中创建一个名为MySQL命令行客户端 - Unicode的项目。该项目通过设置属性以使用Unicode通过控制台与MySQL服务器通信来调用mysql客户端。
要利用此支持手动操作,在使用兼容Unicode字体的控制台中运行mysql,并将默认字符集设置为与服务器通信的Unicode字符集:
- 打开控制台窗口。
- 转到控制台窗口属性,选择字体选项卡,并选择Lucida Console或其他兼容的Unicode字体。这很重要,因为默认情况下,控制台窗口使用DOS栅格字体,这对Unicode来说是不够的。
- 执行带有–default-character-set=utf8mb4(或utf8mb3)选项的mysql.exe。这个选项很重要,因为utf16le是不能用作客户端字符集的字符集之一。参见不允许的客户端字符集。
- 有了这些更改,mysql使用Windows API使用UTF-16LE与控制台通信,并与服务器使用UTF-8通信。(前面提到的菜单项设置了字体和字符集,如上所述。)
为了避免每次运行mysql时都进行这些步骤,您可以创建一个调用mysql.exe的快捷方式。快捷方式应该将控制台字体设置为Lucida Console或其他兼容的Unicode字体,并向mysql.exe传递–default-character-set=utf8mb4(或utf8mb3)选项。
或者,创建一个只设置控制台字体的快捷方式,并在my.ini文件的[mysql]组中设置字符集:
[mysql] default-character-set=utf8mb4 # 或 utf8mb3
垂直显示查询结果
某些查询结果在垂直格式下更容易阅读,而不是通常的水平表格格式。通过在查询中使用,可以将查询垂直显示。例如,较长的文本值(包括换行符)通常更容易用垂直输出阅读:
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: jones@example.com mail_to: "John Smith" <smith@example.com> 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)
使用安全更新模式(–safe-updates)
对于初学者,一个有用的启动选项是 –safe-updates(或 –i-am-a-dummy,效果相同)。在可能发出 UPDATE 或 DELETE 语句但忘记了指定表示要修改的行的 WHERE 子句的情况下,安全更新模式很有帮助。通常,这样的语句会更新或删除表中的所有行。通过指定键值、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 子句。
将 max_join_size 设置为 1,000,000 会导致多表 SELECT 语句在服务器估计必须检查超过 1,000,000 行组合时产生错误。
要指定与 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 系统变量允许的范围。优化器然后回退到表扫描。参见 Limiting Memory Use for Range Optimization。
- 如果键比较需要类型转换,索引可能不会被使用。假设一个索引字符串列 c1 与一个数值值使用 WHERE c1 = 2222 进行比较。对于这样的比较,字符串值被转换为数字,操作数按数字进行比较,从而阻止使用索引。如果启用了安全更新模式,将出现错误。
对于多表删除和更新,只有在任何目标表使用表扫描时才在启用安全更新的情况下产生错误。
禁用 mysql Auto-Reconnect
如果在发送语句时 mysql 客户端与服务器失去连接,它会立即自动尝试重新连接一次并再次发送语句。然而,即使 mysql 成功重新连接,您的第一次连接已经结束,您之前的所有会话对象和设置都将丢失:临时表、自动提交模式和用户定义和会话变量。此外,任何当前事务都会回滚。这种行为可能对您不利,因为在以下示例中,服务器在第一次和第二次语句之间关闭并重新启动,而您不知道这一点:
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 mysql> SELECT * FROM t; +------+ | a | +------+ | NULL | +------+ 1 row in set (0.05 sec)
@a
用户变量已经丢失,并且重新连接后未定义。如果失去连接时mysql终止并报错很重要,则可以使用--skip-reconnect
选项启动mysql客户端。
mysql客户端解析器与服务器解析器
mysql 客户端使用客户端侧的解析器,该解析器不是服务器端使用的完整解析器的副本。这可能导致某些结构的不同处理。例如:
服务器解析器将用双引号分隔的字符串视为标识符,如果启用了 ANSI_QUOTES SQL 模式,则将其视为普通字符串。
mysql 客户端解析器不考虑 ANSI_QUOTES SQL 模式。它将用双引号分隔的字符串、单引号分隔的字符串和反引号分隔的字符串视为相同的东西,无论是否启用 ANSI_QUOTES。
在
/*! ... */
和/*+ ... */
注释中,mysql 客户端解析器解释短形式的 mysql 命令。服务器解析器不会解释这些命令,因为这些命令在服务器端没有意义。如果希望 mysql 不在注释中解释短形式命令,可以使用 –binary-mode 选项作为部分解决方案,该选项在所有非交互模式下(用于输入管道到 mysql 或使用 source 命令加载的内容)禁用所有 mysql 命令,除了 和