स्ट्रिंगल शाब्दिक और पोस्टग्रैक्स्ल में पात्रों से बच


113

एक चेतावनी में एक परिणाम के रूप में एक भागने चरित्र सम्मिलित करने का प्रयास कर रहा है।

उदाहरण के लिए:

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

चेतावनी उत्पन्न करता है:

WARNING:  nonstandard use of escape in a string literal

( PSQL 8.2 का उपयोग करके )

किसी को पता है कि यह चारों ओर पाने के लिए कैसे?

जवाबों:


131

आंशिक रूप से। पाठ सम्मिलित है, लेकिन चेतावनी अभी भी उत्पन्न होती है।

मुझे एक चर्चा मिली जिसने संकेत दिया कि पाठ को 'E' से पहले होना चाहिए, जैसे:

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

इसने चेतावनी को दबा दिया, लेकिन पाठ अभी भी सही ढंग से वापस नहीं किया जा रहा था। जब मैंने माइकल के सुझाव के अनुसार अतिरिक्त स्लैश जोड़ा, तो यह काम कर गया।

जैसे की:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');

5
ध्यान दें कि PostgreSQL 9.0 पर E’testing \\ x20double-slash का मूल्यांकन 'टेस्टिंग \\ x20double-slash' के रूप में होगा, इसलिए E'string की शैली के लिए केवल एकल-स्लेश दृष्टिकोण काम करता है
अलेक्जेंडर

2
PostgreSQL 9.2 के लिए देखें: postgresql.org/docs/9.2/interactive/…
पिट

psql \copyनोट: मैंने पाया कि जब मैंने psql के `\ copy 'मेटा-कमांड के क्वेरी तर्क में इसका उपयोग किया था, तो इसे एक नई पंक्ति के रूप में E'\n'दर्ज करने के लिए लिखा गया था '\n'
स्टूज

40

ठंडा।

मुझे E के संबंध में दस्तावेज भी मिले:

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL स्ट्रिंग मानकों को "पलायन" भी स्वीकार करता है, जो कि एसक्यूएल मानक के लिए एक विस्तार है। ओपनिंग कोटे से पहले ई (अपर या लोअर केस) लेटर लिखने से एक एस्केप स्ट्रिंग कंटीन्यू निर्दिष्ट किया जाता है, जैसे कि 'ईफू'। (जब लाइनों में से एक एस्केप स्ट्रिंग कंटीन्यू को जारी रखते हुए, पहले ओपनिंग कोटे से पहले केवल E लिखें।) एक एस्केप स्ट्रिंग के भीतर, एक बैकस्लैश कैरेक्टर (\) एक सी-लाइक बैकस्लैश एस्केप सीक्वेंस शुरू करता है, जिसमें बैकस्लैश और निम्नलिखित कैरेक्टर का कॉम्बिनेशन होता है ( s) एक विशेष बाइट मान का प्रतिनिधित्व करता है। \ b एक बैकस्पेस है, \ f एक फॉर्म फ़ीड है, \ n एक नई लाइन है, \ r एक गाड़ी वापसी है, \ t एक टैब है। इसके अलावा समर्थित \ digits हैं, जहां अंक एक ऑक्टल बाइट मान का प्रतिनिधित्व करते हैं, और \ xhexdigits, जहां हेक्सडिटिज एक हेक्साडेसिमल बाइट मान का प्रतिनिधित्व करता है। (यह आपकी ज़िम्मेदारी है कि आप जो बाइट अनुक्रम बनाते हैं, वह सर्वर वर्ण सेट एन्कोडिंग में मान्य वर्ण होते हैं।) बैकस्लैश का अनुसरण करने वाले किसी भी अन्य वर्ण को शाब्दिक रूप से लिया जाता है। इस प्रकार, बैकस्लैश कैरेक्टर को शामिल करने के लिए, दो बैकस्लैश (\\) लिखें। साथ ही, '' '' के सामान्य तरीके के अलावा एक एकल उद्धरण को एस्केप स्ट्रिंग में शामिल किया जा सकता है।


6

चेतावनी जारी की जाती है क्योंकि आप अपने तार में बैकस्लैश का उपयोग कर रहे हैं। यदि आप संदेश से बचना चाहते हैं, तो यह कमांड टाइप करें "standard_conforming_strings = on?"। फिर बैकस्लैश सहित अपने स्ट्रिंग से पहले "ई" का उपयोग करें जिसे आप पोस्टग्रेजल को इंट्रेप्रेट करना चाहते हैं।


1
ज़रुरी नहीं। यदि मेरे पास standard_conforming_strings = है और कमांड चलाता है \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f', तो मुझे मिलता है parse error at "'\x7f'"। अगर मेरे पास standard_conforming_strings = off है; और E और उद्धरण के बिना ऊपर एक ही कमांड का उपयोग करें ... (DELIMITER AS \ x7f) मुझे चेतावनी संदेश मिलता है, लेकिन डेटा ठीक लोड होता है। तो आपका बयान सही हो सकता है लेकिन इस मामले में नहीं।

मैं एसक्यूएल बयानों में तार का उल्लेख कर रहा था, जबकि आप अब एक psql कमांड का उपयोग कर रहे हैं। क्या आपको कॉपी के बजाय COPY कमांड का उपयोग करके एक ही त्रुटि मिलती है?
इप्सुइग

1
यह सही जवाब है। पीजी के आधुनिक संस्करण अब इस पर होने के लिए डिफ़ॉल्ट हैं।
jpmc26

3

मुझे लगता है कि Postgres द्वारा इनपुट पर आपके डेटा को कम करने के लिए यह बहुत संभावना नहीं है - यह या तो इसे अस्वीकार करता है या इसे स्टोर करता है।

milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

कृपया मेरे द्वारा दिए गए परीक्षण मामले को आज़माएँ और आप इसे अपने लिए देखेंगे।
rjohnston

दिलचस्प है, ऐसा लगता है कि समस्या तब जेडीबीसी चालक में थी, क्योंकि डेटाबेस से निकलने वाला पाठ निश्चित रूप से छोटा किया जा रहा था ...
rjohnston

3
Postgres कुछ विशिष्ट स्थितियों में इनपुट पर डेटा को काटता है । उदाहरण के लिए, एक character varying(4)कॉलम दिया गया इनपुट "टेस्ट" (शब्द, 6 वर्णों के बाद के दो स्थान) रिक्त स्थान को काट देगा और "परीक्षण" मान को संग्रहीत करेगा। एक सामान्य नियम के रूप में, हालांकि, आप यह मान सकते हैं कि Postgres आपके डेटा को कम करने के बजाय त्रुटि करेगा।
ब्रायनसन

0

वास्तव में बेवकूफ सवाल: क्या आप सुनिश्चित हैं कि स्ट्रिंग को काट दिया जा रहा है, और न केवल आपके द्वारा निर्दिष्ट लाइनब्रेक पर टूट गया है (और संभवतः आपके इंटरफ़ेस में नहीं दिखा रहा है)? यानी, क्या आपको उम्मीद है कि इस क्षेत्र में प्रदर्शन होगा

यह डाला जाएगा \ n यह नहीं होगा

या

यह डाला जाएगा

यह नहीं होगा

इसके अलावा, आप किस इंटरफ़ेस का उपयोग कर रहे हैं? क्या यह संभव है कि रास्ते में कुछ आपके बैकस्लैश खा रहा है?


1
यह मेरे साथ हुआ। पाठ को एक टेक्स्ट बॉक्स में डाला जा रहा था, स्रोत को देखा, और निश्चित रूप से पर्याप्त था, एक उद्धरण था और संपूर्ण पाठ मौजूद था, बस दिखाई नहीं दे रहा था
roberthuttinger
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.