2008-08-04 35 views
91

में स्ट्रिंग अक्षर और बचने के पात्रों को तालिका में एक भागने वाले चरित्र को सम्मिलित करने का प्रयास चेतावनी में होता है।पोस्टग्रेस्क्ल

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

WARNING: nonstandard use of escape in a string literal 

किसी को भी पता है कि इस के आसपास पाने के लिए (psql 8.2 का उपयोग करते हुए):

create table EscapeTest (text varchar(50)); 

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

चेतावनी का उत्पादन?

उत्तर

104

आंशिक रूप से। पाठ डाला गया है, लेकिन चेतावनी अभी भी उत्पन्न हुई है।

मैं एक चर्चा है कि पाठ 'ई' के साथ पहले आना करने के लिए आवश्यक संकेत दिया, इस तरह के रूप में पाया:

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' शैली के लिए काम करता है – Alexander

+2

PostgreSQL 9.2 के लिए देखें: http : //www.postgresql.org/docs/9.2/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE – Pitt

+0

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

32

कूल।

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

PostgreSQL भी स्वीकार करता है "पलायन" स्ट्रिंग स्थिरांक है, जो SQL मानक के लिए एक विस्तार कर रहे हैं:

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

2

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

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

या

यह

हो जाएगा ताकि डाला जाएगा उम्मीद करते हैं

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

+1

यह मेरे साथ हुआ। टेक्स्ट को टेक्स्ट बॉक्स में डाला जा रहा था, स्रोत को देखा गया था, और निश्चित रूप से पर्याप्त था, वहां एक उद्धरण था और पूरा टेक्स्ट मौजूद था, बस – roberthuttinger

3

मुझे पोस्टग्रेज़ के इनपुट पर आपके डेटा को छोटा करने की संभावना बहुत कम है - यह या तो इसे अस्वीकार करती है या इसे स्टोर करती है।

[email protected]:~$ 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=> 
+0

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

+0

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

+2

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

5

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

+1

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

+0

मैं SQL कथन में तारों का जिक्र कर रहा था, जबकि अब आप एक psql कमांड का उपयोग कर रहे हैं। क्या आपको \ copy की बजाय COPY कमांड का उपयोग करके एक ही त्रुटि मिलती है? – eppesuig

+0

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^