myql查询创建表语句SHOWCREATETABLEtable_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设置的(不⽀持myf设置)。
设置后,可见下⾯的没有重⾳符了。
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 (
tabletableid int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论