SHOW CREATE TABLE table_name

SHOW CREATE TABLE table_name (2012-05-16 18:04:58)

转载自:

http://blog.sina.com.cn/s/blog_86d9fde701014dm1.html



技术背景:

刚开始学习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 droptest表,再复制刚才的创建语句,执行后,出现预期的语法错误。

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 那查看码表后,才知`"重音符",不是ASCII39的单引号。

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,有两个值(10),默认是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

你可能感兴趣的:(SHOW CREATE TABLE table_name)