0

このクエリを使用して、いくつかのフィールドをファイルに出力したいと思います。

SELECT
    CONCAT('[',
        GROUP_CONCAT(
            CONCAT(CHAR(13), CHAR(9), '{"name":"', name, '",'),
            CONCAT('"id":', CAST(rid AS UNSIGNED), '}')
        ),
    CHAR(13), ']')
AS json FROM `role`
INTO OUTFILE '/tmp/roles.json'

出力ファイルでは、次のようなものが表示されます。

[
\       {"name":"anonymous user","rid":1},
\       {"name":"authenticated user","rid":2},
\       {"name":"admin","rid":3},
\       {"name":"moderator","rid":4}
]

ご覧のとおり、改行(char(13))には円記号はありませんが、タブ文字(char(9))には円記号があります。どうすればそれらを取り除くことができますか?

UPDATE Sundar Gがキューをくれたので、クエリを次のように変更しました。

SELECT
    CONCAT('"name":', name),
    CONCAT('"rid":', rid)

INTO outfile '/tmp/roles.json'

FIELDS TERMINATED BY ','
LINES STARTING BY '\t{' TERMINATED BY '},\n'

FROM `role`

理由はわかりませんが、この構文では出力ファイルからバックスラッシュが削除されます。

       {"name":"anonymous user","rid":1},
       {"name":"authenticated user","rid":2},
       {"name":"admin","rid":3},
       {"name":"moderator","rid":4}

これはすでにかなり良い出力ですが、ファイルの最初と最後に開き角かっこと閉じ角かっこを追加したいと思います。MySQL構文を使用してこれを行うことはできますか、それとも手動で行う必要がありますか?

4

2 に答える 2

2

SELECT ... INTO構文で説明されているように:

ステートメントの一部の構文は、ステートメントで使用されるものとexport_options同じ句FIELDSと句で構成されます。デフォルト値や許容値など、および句の詳細については、13.2.6項「<code>LOADDATAINFILE構文」</a>を参照してください。LINESLOAD DATA INFILEFIELDSLINES

その参照ページには次のように書かれています。

noFIELDSまたはLINES句を指定した場合、デフォルトは次のように記述した場合と同じです。

'\t'で終了するフィールド''で囲まれている''エスケープされている'\\'
'\n'で終了する行''で開始

後で説明します:

出力の場合、FIELDS ESCAPED BY文字が空でない場合は、出力で次の文字の接頭辞として使用されます。

  • FIELDS ESCAPED BYキャラクター_

  • FIELDS [OPTIONALLY] ENCLOSED BYキャラクター_

  • FIELDS TERMINATED BYおよびLINES TERMINATED BY値の最初の文字

  • ASCII 0(エスケープ文字の後に実際に書き込まれるのはASCII「<code> 0」であり、ゼロ値のバイトではありません)

文字が空の場合、FIELDS ESCAPED BY文字はエスケープされず、ではなく、NULLとして出力されます。空のエスケープ文字を指定することはおそらくお勧めできません。特に、データのフィールド値に、指定したリストの文字が含まれている場合はなおさらです。NULL\N

FIELDSしたがって、句を明示的に指定していないため、TERMINATED BYフィールド内でのデフォルト文字(つまり、タブ)の出現は、デフォルト文字(つまり、ESCAPED BY円記号)によってエスケープされます。したがって、作成しているタブ文字はそのようにエスケープされます。これを回避するには、別のフィールド終了文字を明示的に指定するか、空の文字列をエスケープ文字として使用します。

ただし、結果のサイズはによって制限されることにも注意してくださいgroup_concat_max_len。おそらく、より良いオプションは次のようになります。

SELECT json FROM (
  SELECT 1 AS sort_col, '[' AS json
UNION ALL
  SELECT 2, CONCAT('\t{"name":', QUOTE(name), ',"id":', CAST(rid AS UNSIGNED), '}')
  FROM   role
UNION ALL
  SELECT 3, ']'
) t
ORDER BY sort_col
INTO OUTFILE '/tmp/roles.json' FIELDS ESCAPED BY ''
于 2012-08-27T07:53:00.070 に答える
0

SELECT your_fields
INTO outfile'/ path /file'フィールドを'"'で囲み、'行を'\n'FROMテーブルで終了します。
これが機能することを願っています。

于 2012-08-27T05:26:48.097 に答える