sql >> データベース >  >> RDS >> PostgreSQL

改行のある列名

    列名は識別子であり、識別子の構文の詳細については、次のURLで説明しています。

    http://www.postgresql .org / docs / current / static / sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

    TL; DR U&"..."を使用します 印刷不可能な文字をUnicodeコードポイントを介して識別子に挿入する構文。CR,LFを統合する方法はありません。 LFを使用 一人で。

    1行で列を参照する方法

    識別子にUnicodeエスケープシーケンスを使用することが許可されているため、ドキュメントによると、次のように機能します。

    select U&"first\000asecond" from Two;
    

    2つの単語の間の改行文字の場合。

    最初のテーブルのクエリはどうなりますか

    テーブルは次のもので作成されます:

    CREATE TABLE One("first\nsecond" text);
    

    ここでは円記号には特別な意味がないため、この列には改行が含まれていません。firstが含まれています。 続いて\ 続いてn 続いてsecond .So:

     SELECT "first\nsecond" from One;
    

    CREATE TABLEにあるものと同じであるため、機能します

    一方

    SELECT "first
    second" from One;
    

    そのSELECTに改行があり、テーブルの実際の列名にバックスラッシュとそれに続くnがあるため、失敗します。 。

    2番目のテーブルのクエリはどうなりますか

    これは「One」の反対です。

    CREATE TABLE Two("first
    second" text);
    

    改行は逐語的に取られ、列の一部です。したがって、

    SELECT "first
    second" from Two;
    

    改行がCREATETABLEとまったく同じように存在し、改行が埋め込まれているため、機能しますが、

    SELECT "first\nsecond" from Two;
    

    以前のように\nであるため、失敗します この文脈では、改行を意味するものではありません。

    キャリッジリターンに続いて改行、またはその他の奇妙なもの

    コメントと編集で述べたように、これは代わりにキャリッジリターンと改行である可能性があります。その場合、次のようにする必要があります。

    select U&"first\000d\000asecond" from Two;
    

    私のテストでは、psqlを使用して列の中央でEnterキーを押しています。 UnixとWindowsでも同じ効果があります。つまり、列名に1つの改行が含まれます。

    列名に含まれる正確な文字を確認するために、16進数で検査できます。

    Unixのpsql内から、テーブル作成の例に適用する場合:

    CREATE TABLE Two("first
    second" text);
    
    select convert_to(column_name::text,'UTF-8')
     from information_schema.columns 
     where table_schema='public'
       and table_name='two';
    

    結果は次のとおりです。

            convert_to         
    ----------------------------
     \x66697273740a7365636f6e64
    

    より複雑なケース(UTF-8で数バイトの非ASCII文字など)の場合、読みやすいコードポイントの場合は、より高度なクエリが役立つ場合があります。

    select c,lpad(to_hex(ascii(c)),4,'0') from (
      select regexp_split_to_table(column_name::text,'')  as c
        from  information_schema.columns
        where table_schema='public'
        and table_name='two'
      ) as g;
    
     c | lpad 
    ---+------
     f | 0066
     i | 0069
     r | 0072
     s | 0073
     t | 0074
      +| 000a
       | 
     s | 0073
     e | 0065
     c | 0063
     o | 006f
     n | 006e
     d | 0064
    



    1. MySQL + PHP:外部キーを使用してデータをフェッチする

    2. PythonでMySQLdbモジュールをインポートできません

    3. 複数行の挿入内でLAST_INSERT_ID()を使用する

    4. FuelPHPオイル移行が機能しない