स्तंभ नाम पहचानकर्ता हैं, और पहचानकर्ताओं के लिए वाक्य रचना के रक्तरंजित विवरण का वर्णन यहां किया गया है:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :U&"..."
. का उपयोग करें गैर-मुद्रण योग्य वर्णों को उनके यूनिकोड कोडपॉइंट के माध्यम से पहचानकर्ताओं में इंजेक्ट करने के लिए सिंटैक्स, और CR,LF
को एकीकृत करने का कोई तरीका नहीं है LF
. के साथ अकेले।
एक पंक्ति में कॉलम का संदर्भ कैसे लें
हमें पहचानकर्ताओं में यूनिकोड एस्केप अनुक्रमों का उपयोग करने की अनुमति है, इसलिए प्रति दस्तावेज़ीकरण, निम्नलिखित कार्य करता है:
select U&"first\000asecond" from Two;
अगर यह दो शब्दों के बीच सिर्फ एक न्यूलाइन कैरेक्टर है।
पहली तालिका में क्वेरी के साथ क्या होता है
तालिका निम्न के साथ बनाई गई है:
CREATE TABLE One("first\nsecond" text);
चूंकि बैकस्लैश कैरेक्टर का यहां कोई विशेष अर्थ नहीं है, इसलिए इस कॉलम में कोई नई लाइन नहीं है। इसमें first
शामिल है। उसके बाद \
उसके बाद n
उसके बाद second
.सो:
SELECT "first\nsecond" from One;
काम करता है क्योंकि यह वही है जो CREATE TABLE
में है
जबकि
SELECT "first
second" from One;
विफल रहता है क्योंकि उस चयन में एक नई पंक्ति है जहां तालिका में वास्तविक कॉलम नाम में बैकस्लैश है और उसके बाद n
है ।
दूसरी तालिका में क्वेरी के साथ क्या होता है
यह "एक" के विपरीत है।
CREATE TABLE Two("first
second" text);
न्यूलाइन शब्दशः लिया जाता है और कॉलम का हिस्सा होता है। तो
SELECT "first
second" from Two;
काम करता है क्योंकि नई लाइन ठीक उसी तरह है जैसे क्रिएट टेबल में, एक एम्बेडेड न्यूलाइन के साथ, जबकि
SELECT "first\nsecond" from Two;
विफल रहता है क्योंकि पहले की तरह \n
इस संदर्भ में एक नई पंक्ति का मतलब नहीं है।
कैरिज रिटर्न के बाद न्यूलाइन, या कुछ भी अजीब
जैसा कि टिप्पणियों और आपके संपादन में उल्लेख किया गया है, यह कैरिज रिटर्न और न्यूलाइन हो सकता है, इस मामले में निम्नलिखित को करना चाहिए:
select U&"first\000d\000asecond" from Two;
हालांकि मेरे परीक्षण में, psql
. के साथ कॉलम के बीच में एंटर दबाएं यूनिक्स और विंडोज़ पर समान प्रभाव पड़ता है:कॉलम के नाम में एक नई लाइन।
यह जांचने के लिए कि कॉलम नाम में कौन से अक्षर समाप्त हुए हैं, हम उनका हेक्साडेसिमल में निरीक्षण कर सकते हैं।
जब आपके निर्माण तालिका उदाहरण पर लागू किया जाता है, तो यूनिक्स के अंतर्गत 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 में कई बाइट्स वाले गैर-असीसी वर्ण), आसानी से पढ़े जाने वाले कोडपॉइंट के लिए एक अधिक उन्नत क्वेरी मदद कर सकती है:
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