在mysql中打印\ G的问题。?

时间:2012-02-23 11:01:56

标签: mysql shell

我正在执行一个命令

mysql -uroot -proot -Bse "select Concat('SHOW CREATE TABLE ',TABLE_SCHEMA ,'.',TABLE_NAME,'\\G') from information_schema.tables where TABLE_SCHEMA Not IN('mysql','information_schema','performance_schema');"

我希望输出为

SHOW CREATE TABLE sakila.category\G
SHOW CREATE TABLE sakila.city\G
SHOW CREATE TABLE sakila.country\G
SHOW CREATE TABLE sakila.customer\G

但我得到了

SHOW CREATE TABLE sakila.categoryG
SHOW CREATE TABLE sakila.cityG
SHOW CREATE TABLE sakila.countryG
SHOW CREATE TABLE sakila.customerG

为什么会这样?我哪里错了?

更新

如果我写

mysql -uroot -proot -Bse "select Concat('SHOW CREATE TABLE ',TABLE_SCHEMA ,'.',TABLE_NAME,'\\\\G') from information_schema.tables where TABLE_SCHEMA Not IN('mysql','information_schema','performance_schema');"

我输出为

SHOW CREATE TABLE sakila.category\\G
SHOW CREATE TABLE sakila.city\\G
SHOW CREATE TABLE sakila.country\\G
SHOW CREATE TABLE sakila.customer\\G

但我只想要\G,而不是\\G

2 个答案:

答案 0 :(得分:2)

您可以使用sed来解决此问题。

这就是我所做的。

  1. 将CONCAT来电的结束字符串从\\G更改为\\\\G
  2. 将输出传送到sed -s 's/\\\\G/\\G/'以替换它。
  3. 这是查询。

    mysql -uroot -proot -Bse "select Concat('SHOW CREATE TABLE ',TABLE_SCHEMA ,'.',TABLE_NAME,'\\\\G') from information_schema.tables where TABLE_SCHEMA Not IN('mysql','information_schema','performance_schema')" | sed -s 's/\\\\G/\\G/'
    

答案 1 :(得分:2)

您需要额外的转义级别:\\\\

您通过shell命令行给MySQL查询字符串。 shell将\\\\\\两次)变为两个\,i。即\\。那是因为它包含在" s。

MySQL将\\\\视为\\,并且由于它有自己的转义,因此将其用作\


编辑:我不明白为什么,但这不适用于您的查询。

但是,通过摆弄它,人们发现\\\\G\\\G都是可行的。

唉,MySQL CLI客户端的输出会修改数据。因为它的输出被转义为允许\0。要输出\t等,它也必须在输出时转义\

使用CLI参数-r--raw,您可以禁用该行为。 (但是,s选项应该是多余的,因为它包含在B中。)并且N可能会有用,禁用标题。

因此,使用-Bre-NBre代替-Bse\\\\G完全没问题。