MySQL对分隔符的处理(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
MySQL对分隔符的处理(一)
2011-09-07 22:24

    MySQL的语法与标准SQL语法相同,默认使用分号“;”作为一条SQL语句结束的标志。且可以使用delimiter命令将其修改成其他符号,如:“delimiter |”。在MySQL看来所有的语句可以分为两类,一类是SQL Statement(SQL语句),一类是Command Statement(系统命令)。

 

    系统命令无需在语句结尾处添加分号直接回车即可,通常情况下长格式的系统命令在行尾添加分号不会影响命令的正常执行,如:use test;。习惯了每敲一条命令都打一个分号的管理员和程序员们现在注意了,分号不要随便敲,MySQL在这里给我们挖了一个坑。

让我们来看一个案例:

    使用mysqldump命令导出一个名为"pp#idhuishou"的表,mysqldump -uroot -p test pp#idhuishou -r pp#idhuishou.sql,文件名与表名相同都含有一个井号。 使用SOURCE命令再导入数据的时候,我又习惯性的在结尾多打了一个分号,结果敲完分号再敲回车语句不执行,如果不敲分号,语句正常执行,数据被成功灌入,显然是客户端把井号后的内容当成注释来处理了。

mysql> source pp#idhuishou.sql;
    -> 
  • 变通解决办法:
    • 使用输入重定向的方式导入mysql -uroot -p test < pp#idhuishou.sql
    • 将文件重命名再SOURCE,不包含井号就不会受分号影响mv pp#idhuishou.sql idhuishou.sql

    

    让我们分析一下MySQL倒底搞了什么鬼,MySQL处理一条语句首先要判断这条语句是否为系统命令,如果是系统命令会有单独的函数单独处理,如:com_warnings,com_use,com_source,com_help等。

 

 

    Code:
static int read_and_execute(bool in interactive) {
    for(;;) {
    ... ...

if ((named_cmds || glob_buffer.is_empty()) && !ml_comment && !in_string && (com=find_command(line,0))) 

//find_command函数用来判断一条语句是否为系统命令

{

if ((*com->func)(&glob_buffer,line) > 0) 

//*com->func为一个函数指针,分别指向不同命令的函数,如com_warnings,com_use,com_source,com_help等

break; if (glob_buffer.is_empty()) // If buffer was emptied in_string=0; #ifdef HAVE_READLINE if (interactive && status.add_to_history && not_in_history(line)) add_history(line); #endif continue; } if (add_line(glob_buffer,line,&in_string,&ml_comment)) //如果语句不是系统命令就会走到这里 break; } /* if in batch mode, send last query even if it doesn't end with \g or go */ if (!interactive && !status.exit_status) { remove_cntrl(glob_buffer); if (!glob_buffer.is_empty()) { status.exit_status=1; if (com_go(&glob_buffer,line) <= 0) status.exit_status=0; } } ... ...

 

(未完待续)













本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/748594,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL MySQL 关系型数据库
|
9天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
1月前
|
关系型数据库 MySQL Python
python安装MySQL-python:EnvironmentError解决办法
python安装MySQL-python:EnvironmentError解决办法
29 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
28天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
80 1
|
22天前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 中apt 安装MySQL数据库
Ubuntu 中apt 安装MySQL数据库
66 0
|
1天前
|
关系型数据库 MySQL Linux
Linux联网安装MySQL Server
Linux联网安装MySQL Server
5 0
|
1天前
|
关系型数据库 MySQL Linux
centos7安装mysql-带网盘安装包
centos7安装mysql-带网盘安装包
19 2

推荐镜像

更多