zoukankan      html  css  js  c++  java
  • myql查询创建表语句SHOW CREATE TABLE table_name

    技术背景:
    刚开始学习MySQL时候,有时偷懒,会用SHOW CREATE TABLE 表名G来复制表创建语句,可是当运行的时候总会因为"表名和列名上有单引号",提示语法错误不能运行。
    问题列表:
    1,为什么会出错呢?
    2,有什么解决方法?
    解决问题:
    1,分析show create table拷贝的语句出错原因
    1.1 重现过程
    1.1.1 创建测试表test,并通过show create table test取得表的创建语句,可见表名,列名都用引号包着。
    mysql> create table test(
    -> id int not null,
    -> primary key(id)
    -> );
    Query OK, 0 rows affected (0.00 sec)
    mysql> show create table test G
    *************************** 1. row ***************************
    Table: test
    Create Table: CREATE TABLE `test` (
    `id` int(11) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    1.1.2 drop掉test表,再复制刚才的创建语句,执行后,出现预期的语法错误。
    mysql> drop table test;
    Query OK, 0 rows affected (0.00 sec)
    mysql> Create Table: CREATE TABLE `test` (
    -> `id` int(11) NOT NULL,
    -> PRIMARY KEY (`id`)
    -> ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    -> ;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ': CREATE

    1.2 原理
    1.2.1 如果仔细看`test`与单引号的'test'外观上有点区别,那用字符串函ASCII()来验证一下(复制语句中`)。
    从下面测试结果可知,`的ASCII码是96, 那查看码表后,才知`是"重音符",不是ASCII为39的单引号。
    mysql> select ASCII('`');
    +------------+
    | ASCII('`') |
    +------------+
    | 96 |
    +------------+
    //查看单引号的ASCII码
    mysql> select ASCII("'");
    +------------+
    | ASCII("'") |
    +------------+
    | 39 |
    +------------+
    说明:重音符在键盘第二排第一个键,发现的时候,我表示相当尴尬。
    2 解决问题
    2.1 利用Session设置参数set sql_quote_show_create=0;
    2.1.1 sql_quote_show_create,有两个值(1,0),默认是1,表示表名和列名会用``包着的。
    这个服务器参数只可以在session级别设置,不支持global设置的(不支持my.cnf设置)。
    设置后,可见下面的没有重音符了。
    mysql> set sql_quote_show_create=0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> show create table test G
    *************************** 1. row ***************************
    Table: test
    Create Table: CREATE TABLE test (
    id int(11) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    2.2 使用pager来处理输出
    mysql> pager tr -d '`'
    PAGER set to 'tr -d '`''
    mysql> show create table test;
    +-------+------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+------------------------------------------------------------------------------------------------------------+
    | test | CREATE TABLE test (
    id int(11) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

    3, 命令行的使用:偷懒是一回事,如果在写shell, python等工具的时候,可能会根据show create table来处理一些事情,即“命令行处理”
    3.1 用'SET SQL_QUOTE_SHOW_CREATE=0
    -bash-3.2$ mysql -uroot -e 'SET SQL_QUOTE_SHOW_CREATE=0; use test; show create table test';
    +-------+------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+------------------------------------------------------------------------------------------------------+
    | test | CREATE TABLE test (
    id int(11) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
    +-------+------------------------------------------------------------------------------------------------------+
    3.2
    -bash-3.2$ mysql -e 'use test; show create table test G' | tr -d '`';
    *************************** 1. row ***************************
    Table: test
    Create Table: CREATE TABLE test (
    id int(11) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    3.3 也可以使用sed来解决
    -bash-3.2$ mysql -e 'use test; show create table test G' | sed -e 's/`//g';
    *************************** 1. row ***************************
    Table: test
    Create Table: CREATE TABLE test (
    id int(11) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1

  • 相关阅读:
    C/C++的区别
    stm32之UCOS-III
    PID控制及整定算法
    PCB设计基础及技巧
    电路的一些基本理论
    stm32与三菱PLC通信
    stm32之外设控制
    stm32之内部功能
    JavaScript数组方法详解
    git新建关联克隆仓库指令
  • 原文地址:https://www.cnblogs.com/zywf/p/4951185.html
Copyright © 2011-2022 走看看