স্ট্রিং আক্ষরিক এবং পোষ্টগ্র্যাস্কএল অক্ষরগুলি


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

( পিএসকিউএল ৮.২ ব্যবহার করে )

কেউ কিভাবে এই কাছাকাছি পেতে জানেন?

উত্তর:


131

আংশিকভাবে। পাঠ্যটি isোকানো হয়েছে, তবে সতর্কতাটি এখনও উত্পন্ন হয়েছে।

আমি একটি আলোচনার সন্ধান পেয়েছি যা ই-এর আগে পাঠ্যটির আগে থাকা প্রয়োজনকে নির্দেশ করেছিল:

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
নোট করুন যে পোস্টগ্রিএসকিউএল 9.0 এ 'টেস্টিং \\ x20 ডাবল-স্ল্যাশ' হিসাবে মূল্যায়ন করবে, সুতরাং কেবল একক স্ল্যাশ পদ্ধতির ই স্ট্রিংয়ের জন্য কাজ করা হয়েছে শৈলীর অক্ষর
আলেকজান্ডার

2
PostgreSQL 9.2 এর জন্য দেখুন: postgresql.org/docs/9.2/interactive/…
পিট

psql \copyদ্রষ্টব্য: আমি খুঁজে পেয়েছি যে যখন আমি পিএসএলএল এর \ \ অনুলিপি 'মেটা-কমান্ডের ক্যোয়ারী যুক্তিতে এটি ব্যবহার করেছি তখন একটি নতুন লাইন হিসাবে E'\n'ফাইল করার জন্য লেখা হয়েছিল '\n'
স্টিউ

40

কুল।

আমি E সংক্রান্ত নথিপত্রও পেয়েছি:

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

পোস্টগ্রেএসকিউএল "এস্কেপ" স্ট্রিং ধ্রুবকগুলিও গ্রহণ করে, যা এসকিউএল স্ট্যান্ডার্ডের একটি এক্সটেনশন। একটি পালানোর স্ট্রিং ধ্রুবকটি খোলার একক উদ্ধৃতি যেমন E'foo এর ঠিক আগে E (উচ্চ বা নিম্ন কেস) অক্ষরটি লিখে নির্দিষ্ট করা হয়। (রেখাগুলি জুড়ে যখন পালানোর স্ট্রিংটি চালিয়ে যাওয়ার সময়, প্রথম প্রথম উদ্বোধনের উদ্ধৃতিটির আগে কেবল E লিখুন)) একটি পালানোর স্ট্রিংয়ের মধ্যে একটি ব্যাকস্ল্যাশ অক্ষর (\) সি-এর মতো ব্যাকস্ল্যাশ পালানোর ক্রম শুরু করে, যেখানে ব্যাকস্ল্যাশ এবং নিম্নলিখিত বর্ণের সংমিশ্রণ ( গুলি) একটি বিশেষ বাইট মান উপস্থাপন করে। \ বি একটি ব্যাকস্পেস, \ f একটি ফর্ম ফিড, \ n একটি নতুন লাইন, \ r একটি ক্যারেজ রিটার্ন, \ t একটি ট্যাব। Supported ডিজিটগুলিও সমর্থিত, যেখানে অঙ্কগুলি একটি অষ্টাল বাইট মান এবং \ xhexdigits উপস্থাপন করে যেখানে হেক্সডিজিটগুলি একটি হেক্সাডেসিমাল বাইট মান উপস্থাপন করে। (এটি আপনার দায়িত্ব যে আপনার তৈরি করা বাইট ক্রমগুলি সার্ভার অক্ষর সেট এনকোডিংয়ে বৈধ অক্ষর)) ব্যাকস্ল্যাশের পরে অন্য কোনও অক্ষর অক্ষরে অক্ষরে নেওয়া হয়। সুতরাং, একটি ব্যাকস্ল্যাশ অক্ষর অন্তর্ভুক্ত করতে দুটি ব্যাকস্ল্যাশ (\\) লিখুন। এছাড়াও, '' র সাধারণ উপায় ছাড়াও 'একক উদ্ধৃতি' writing 'লিখে একটি পালানোর স্ট্রিংয়ের সাথে অন্তর্ভুক্ত করা যেতে পারে।


6

সতর্কতা জারি করা হয়েছে যেহেতু আপনি আপনার স্ট্রিংগুলিতে ব্যাকস্ল্যাশ ব্যবহার করছেন। আপনি যদি বার্তাটি এড়াতে চান তবে এই কমান্ডটি "স্ট্যান্ডার্ড_কনফর্মিং_স্ট্রিংস = অন;" টাইপ করুন। তারপরে আপনার স্ট্রিংয়ের পূর্বে "ই" ব্যবহার করুন ব্যাকস্ল্যাশগুলি সহ যা আপনি পোস্টগ্রেস্কেলটি ব্যাখ্যা করতে চান।


1
আসলে তা না. আমার কাছে যদি স্ট্যান্ডার্ড_ কনফর্মিং_স্ট্রিংস = চালু থাকে এবং কমান্ডটি চালানো হয় তবে \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f'আমি পাই parse error at "'\x7f'"। যদি আমার কাছে স্ট্যান্ডার্ড_ কনফর্মিং_স্ট্রিংস = বন্ধ থাকে; এবং E এবং কোটগুলি ছাড়াই উপরে একই কমান্ডটি ব্যবহার করুন ... (DELIMITER AS \ x7f) আমি সতর্কতা বার্তাটি পাই তবে ডেটা লোড হয়ে যায়। সুতরাং আপনার বিবৃতি সঠিক হতে পারে তবে এই ক্ষেত্রে নয় not

আমি এসকিউএল স্টেটমেন্টগুলিতে স্ট্রিংগুলি উল্লেখ করছিলাম, আপনি এখন একটি পিএসকিএল কমান্ড ব্যবহার করছেন। আপনি \ অনুলিপি পরিবর্তে কপি আদেশটি ব্যবহার করে একই ত্রুটি পেয়েছেন?
eppesuig

1
এটি সঠিক উত্তর। পিজির আধুনিক সংস্করণগুলি এখন এটির জন্য ডিফল্ট।
jpmc26

3

পোস্টগ্র্রেসের পক্ষে আপনার ডেটা ইনপুটটিতে ছাঁটাই করা অত্যন্ত অসম্ভব বলে মনে হয় - এটি হয় এটিকে প্রত্যাখ্যান করে বা এটি যেমন সংরক্ষণ করে তবে তা সংরক্ষণ করে।

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
পোস্টগ্রিস কিছু নির্দিষ্ট পরিস্থিতিতে ইনপুটটিতে ডেটা কাটা করে does উদাহরণস্বরূপ, character varying(4)ইনপুট "পরীক্ষা" প্রদত্ত একটি কলাম (শব্দের পরে দুটি ফাঁকা স্থান, 6 টি অক্ষর) শূন্যস্থানগুলি কেটে যাবে এবং "পরীক্ষা" মানটি সংরক্ষণ করবে। সাধারণ নিয়ম হিসাবে, তবে আপনি ধরে নিতে পারেন যে পোস্টগ্র্যাসগুলি আপনার ডেটা কেটে দেওয়ার পরিবর্তে ত্রুটি করবে।
ব্রাইসন

0

সত্যই বোকা প্রশ্ন: আপনি কি নিশ্চিত যে স্ট্রিংটি কেটে ফেলা হচ্ছে, এবং আপনি যে লাইনব্রেকটি নির্দিষ্ট করেছেন তা কেবল ভাঙ্গা হয়নি (এবং সম্ভবত আপনার ইন্টারফেসে প্রদর্শিত হচ্ছে না)? অর্থাৎ, আপনি কি ক্ষেত্রটি প্রত্যাশা হিসাবে দেখবেন?

এটি sertedোকানো হবে \ n এটি হবে না

অথবা

এটি beোকানো হবে

এটা হবে না

এছাড়াও, আপনি কোন ইন্টারফেস ব্যবহার করছেন? এমন কি সম্ভব যে পথে কিছু আপনার ব্যাকস্ল্যাশগুলি খাচ্ছে?


1
এটা আমার সাথে ঘটেছিল পাঠ্যটি একটি পাঠ্য বাক্সে
sertedোকানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.