পোস্টগ্রিএসকিউএল: পাঠ্য এবং বারচর মধ্যে পার্থক্য (চরিত্রের ভিন্নতা)


618

textডেটা টাইপ এবং character varying( varchar) ডাটা টাইপের মধ্যে পার্থক্য কী ?

ডকুমেন্টেশন অনুযায়ী

দৈর্ঘ্য নির্দিষ্টকারক ব্যতীত চরিত্রের ভিন্নতা যদি ব্যবহার করা হয় তবে টাইপটি কোনও আকারের স্ট্রিং গ্রহণ করে। পরেরটি একটি পোস্টগ্রিজ এসকিউএল এক্সটেনশন।

এবং

তদতিরিক্ত, PostgreSQL পাঠ্য প্রকার সরবরাহ করে, যা কোনও দৈর্ঘ্যের স্ট্রিং সংরক্ষণ করে। যদিও প্রকারের পাঠ্যটি এসকিউএল স্ট্যান্ডার্ডে নেই, তবে বেশ কয়েকটি অন্যান্য এসকিউএল ডাটাবেস ম্যানেজমেন্ট সিস্টেমগুলিতে এটি রয়েছে।

তাহলে পার্থক্য কী?

উত্তর:


745

কোনও পার্থক্য নেই, হুডের নীচে এটি সমস্ত varlena( পরিবর্তনশীল দৈর্ঘ্যের অ্যারে )।

দেপেজ থেকে এই নিবন্ধটি দেখুন: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/

কয়েকটি হাইলাইট:

সব মিলিয়ে সংক্ষেপে:

  • চর (এন) - এর চেয়ে ছোট মানগুলির সাথে কথা বলার সময় খুব বেশি জায়গা নেয় n(এগুলিতে প্যাড করে n), এবং পিছনের স্থানগুলি যুক্ত করার কারণে সূক্ষ্ম ত্রুটি হতে পারে, এবং সীমাটি পরিবর্তন করতে সমস্যা হয়
  • varchar (n) - লাইভ পরিবেশে সীমা পরিবর্তন করতে সমস্যাযুক্ত (টেবিল পরিবর্তন করার সময় একচেটিয়া লক প্রয়োজন)
  • বারচর - ঠিক যেমন পাঠ্য
  • পাঠ্য - আমার জন্য একটি বিজয়ী - ওভার (এন) উপাত্তের ধরণের কারণ এতে তাদের সমস্যাগুলির অভাব রয়েছে, এবং বর্ণেরও বেশি - কারণ এটির স্বতন্ত্র নাম রয়েছে

নিবন্ধটি বিশদ পরীক্ষা করে দেখায় যে সমস্ত 4 ডেটা প্রকারের জন্য সন্নিবেশ এবং নির্বাচনের কার্য সম্পাদন একই রকম। এটি প্রয়োজনের সময় দৈর্ঘ্য সীমাবদ্ধ করার বিকল্প উপায়গুলি সম্পর্কেও বিশদ নজর রাখে। ফাংশন ভিত্তিক সীমাবদ্ধতা বা ডোমেনগুলি দৈর্ঘ্যের সীমাবদ্ধতার তাত্ক্ষণিক বৃদ্ধির সুবিধা প্রদান করে এবং স্ট্রিং দৈর্ঘ্যের সীমাবদ্ধতা হ্রাস করা বিরল বলে ডিপেসে সিদ্ধান্তে পৌঁছে যে তাদের মধ্যে একটি সাধারণত দৈর্ঘ্যের সীমা জন্য সবচেয়ে ভাল পছন্দ।


58
@axiopisty এটি একটি দুর্দান্ত নিবন্ধ। আপনি কেবল বলতে পারেন, "নিবন্ধটি নীচে নেমে যাওয়ার ক্ষেত্রে আপনি কিছু অংশ টানতে পারেন?" আমি নিবন্ধটির বিষয়বস্তু / সিদ্ধান্তগুলি সংক্ষেপে সংক্ষিপ্ত করার চেষ্টা করেছি। আমি আশা করি আপনার উদ্বেগগুলি সহজ করার জন্য এটি যথেষ্ট।
jpmc26

34
@axiopisty, কঠোরভাবে বলতে গেলে, প্রাথমিক উত্তরটি " হুডের নীচে এটি সমস্ত ভের্লেনা " বলছিল , এটি অবশ্যই দরকারী তথ্য যা এই উত্তরটি কেবলমাত্র একটি লিঙ্ক-উত্তর থেকে পৃথক করে।
ব্রুনো

24
সীমাহীন স্ট্রিংয়ের সাথে একটি জিনিস মনে রাখবেন তা হ'ল তারা অপব্যবহারের সম্ভাবনা উন্মুক্ত করে। যদি আপনি কোনও ব্যবহারকারীর যেকোন আকারের শেষ নাম রাখার অনুমতি দেন তবে আপনার কোনও ব্যক্তি আপনার পদবি নামের ক্ষেত্রে প্রচুর পরিমাণে তথ্য সঞ্চয় করতে পারে। রেডডিটের বিকাশের বিষয়ে একটি নিবন্ধে , তারা "সমস্ত কিছুর সীমাবদ্ধতা" রাখার পরামর্শ দেন।
মার্ক হিলড্রেথ

7
@ মার্কহিলড্রেথ গুড পয়েন্ট, যদিও সাধারণভাবে এই জাতীয় সীমাবদ্ধতাগুলি আজকাল একটি প্রয়োগে আরও কার্যকর করা হয় - যাতে বিআই দ্বারা নিয়মগুলি (এবং লঙ্ঘন / পুনরায় চেষ্টা করার চেষ্টা) সুচারুভাবে পরিচালনা করা যায়। যদি এখনও কেউ ডাটাবেসে এই ধরণের জিনিস করতে চান তবে তারা সীমাবদ্ধতাগুলি ব্যবহার করতে পারেন। ব্লগ.জোনানিন.কম / ২০১৩/১০/২০১২ / পোষ্টগ্রেস্ক্ল্ল-चार-vachar দেখুন যা " V अक्षरের চেয়ে আরও নমনীয়তা সহ ক্ষেত্রগুলি তৈরির ক্ষেত্রে পাঠ্য বাছাইয়ের উদাহরণ" অন্তর্ভুক্ত করে।
ইথান

4
@ ইথান ব্লগ.জোনানিন ডটকম / ২০১৩/১০/২০১২ / পোস্টগ্রেসক্ল্ল-चार- ওয়ারচার -> এটি নিচে থাকলেও এখানে আর্কাইভ.আইস / xxhA5 পাওয়া গেছে ।
মিঃআর

115

হিসাবে " ক্যারেক্টার প্রকারভেদ " ডকুমেন্টেশন পয়েন্টে আউট varchar(n), char(n)এবং textসব একই ভাবে সংরক্ষণ করা হয়। পার্থক্যটি হ'ল দৈর্ঘ্যটি পরীক্ষা করার জন্য অতিরিক্ত চক্রের প্রয়োজন, যদি একটি দেওয়া হয় এবং প্যাডিংয়ের জন্য অতিরিক্ত স্থান এবং সময় প্রয়োজন হয় char(n)

তবে, যখন আপনাকে কেবল একটি একক অক্ষর সংরক্ষণ করতে হবে, তখন বিশেষ ধরণের ব্যবহারের ক্ষেত্রে সামান্য পারফরম্যান্স সুবিধা রয়েছে "char"(ডাবল-কোটগুলি রাখুন - তারা টাইপের নামের অংশ)। আপনি মাঠে দ্রুত অ্যাক্সেস পান এবং দৈর্ঘ্য সংরক্ষণ করার জন্য কোনও ওভারহেড নেই।

আমি সবেমাত্র "char"ছোট ছোট বর্ণমালা থেকে বেছে নেওয়া 10,000,000 র্যান্ডম একটি টেবিল তৈরি করেছি । একটি ফ্রিকোয়েন্সি বিতরণ ( select count(*), field ... group by field) পেতে একটি ক্যোয়ারী প্রায় 650 মিলিসেকেন্ড নেয়, কোনও textক্ষেত্র ব্যবহার করে একই ডেটাতে প্রায় 760 বনাম ।


18
প্রযুক্তিগতভাবে উদ্ধৃতিগুলি নামের নামের অংশ নয়। এটিকে চর কীওয়ার্ড থেকে আলাদা করতে হবে।
জেসেন

31
প্রযুক্তিগতভাবে আপনি @ জেসেন সঠিক ... কোনটি অবশ্যই সর্বোত্তম ধরণের
জোহানেস

ডাটাটাইপ "char" হয় না char?? আজকাল পোস্টগ্রিসএসকিউএল 11+ এর ক্ষেত্রে এটি বৈধ? ... হ্যাঁ: "টাইপ "char"(নোট কোট) যে এটি শুধুমাত্র সঞ্চয়ের এক বাইট ব্যবহার মধ্যে গৃহস্থালির কাজ (1) থেকে ভিন্ন এটা অভ্যন্তরীণভাবে একটি সিস্টেম ক্যাটালগ ব্যবহার করা হয়। সরল পরিগণনা প্রকার ।" , গাইড / ডেটাটাইপ-চরিত্র
পিটার ক্রাউস

63

২০১ 2016 সালের জন্য বেঞ্চমার্কগুলি আপডেট করুন (pg9.5 +)

এবং "খাঁটি এসকিউএল" বেঞ্চমার্ক ব্যবহার করে (কোনও বাহ্যিক স্ক্রিপ্ট ছাড়াই)

  1. ইউটিএফ 8 সহ যে কোনও স্ট্রিং_জেনেটর ব্যবহার করুন

  2. প্রধান মানদণ্ড:

    2.1। ঢোকান

    2.2। নির্বাচন এবং গণনা নির্বাচন করুন


CREATE FUNCTION string_generator(int DEFAULT 20,int DEFAULT 10) RETURNS text AS $f$
  SELECT array_to_string( array_agg(
    substring(md5(random()::text),1,$1)||chr( 9824 + (random()*10)::int )
  ), ' ' ) as s
  FROM generate_series(1, $2) i(x);
$f$ LANGUAGE SQL IMMUTABLE;

নির্দিষ্ট পরীক্ষা প্রস্তুত করুন (উদাহরণ)

DROP TABLE IF EXISTS test;
-- CREATE TABLE test ( f varchar(500));
-- CREATE TABLE test ( f text); 
CREATE TABLE test ( f text  CHECK(char_length(f)<=500) );

একটি মৌলিক পরীক্ষা সম্পাদন করুন:

INSERT INTO test  
   SELECT string_generator(20+(random()*(i%11))::int)
   FROM generate_series(1, 99000) t(i);

এবং অন্যান্য পরীক্ষা,

CREATE INDEX q on test (f);

SELECT count(*) FROM (
  SELECT substring(f,1,1) || f FROM test WHERE f<'a0' ORDER BY 1 LIMIT 80000
) t;

... এবং ব্যবহার EXPLAIN ANALYZE

পুনরায় আপডেট 2018 (pg10)

2018 এর ফলাফল যুক্ত করতে এবং সুপারিশগুলিকে শক্তিশালী করতে সামান্য সম্পাদনা করুন।


2016 এবং 2018 এ ফলাফল

আমার ফলাফলগুলি, গড়পড়তাভাবে, অনেকগুলি মেশিনে এবং অনেক পরীক্ষায়: সমস্ত একই
(পরিসংখ্যানগতভাবে কম থম মান বিচ্যুতি)।

সুপারিশ

  • ব্যবহার করুন textডাটাটাইপ,
    পুরাতন এড়াতে varchar(x)কারণ কখনও কখনও এটি একটি প্রমিত, এ যেমন নয় CREATE FUNCTIONক্লজ varchar(x)varchar(y)

  • উদাহরণস্বরূপ ক্লজ সহ সীমা প্রকাশ (একই varcharকার্যকারিতা সহ!) । INSERT / UPDATE এ পারফরম্যান্সের একটি নগণ্য ক্ষতির সাথে আপনি রেঞ্জ এবং স্ট্রিং স্ট্রাকচার নিয়ন্ত্রণও করতে পারেন উদাহরণস্বরূপCHECKCREATE TABLE
    CHECK(char_length(x)<=10)

    CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')


সুতরাং আমি কি সমস্ত কলামের পরিবর্তে পাঠ্যের পরিবর্তে আমার সমস্ত কলামগুলি বারচর বানিয়েছি? আমি দৈর্ঘ্যটি নির্দিষ্ট করেছিলাম না যদিও কিছু 4 - 5 অক্ষর এবং অবশ্যই 255 নয়
খাঁজ

1
@ ট্র্যাচ হ্যাঁ, এটি কোনও ব্যাপার নয়
ফিউরিয়াসফোল্ডার

1
শীতল, আমি এটি নিরাপদে পুনরায় redid করেছি এবং যাইহোক আমি সমস্ত পাঠ্য তৈরি করেছি। এটি ভালভাবে কাজ করেছে এবং যাইহোক দ্রুত লক্ষ লক্ষ historicalতিহাসিক রেকর্ড যুক্ত করা সহজ ছিল।
পরিখা

@ ট্র্যাচ এবং রিডার: একমাত্র ব্যতিক্রম দ্রুত ডেটাটাইপ "char", এটি charপোস্টগ্র্রেএসকিউএল 11+ এর আজও নয় । হিসাবে নির্দেশিকা / ডাটাটাইপ-অক্ষর বলেছেন "টাইপ "char"(নোট কোট) যে এটি শুধুমাত্র সঞ্চয়ের এক বাইট ব্যবহার মধ্যে গৃহস্থালির কাজ (1) থেকে আলাদা। এটা অভ্যন্তরীণভাবে একটি সিস্টেম ক্যাটালগ ব্যবহার করা হয় সরল পরিগণনা প্রকার ।"
পিটার ক্রাউস

3
2019 সালে pg11 এর সাথে এখনও বৈধ: পাঠ্য> বারচর (এন)> পাঠ্য_চেক> চর (এন)
অলিভিয়ার রেফালো

37

PostgreSQL ম্যানুয়ালটিতে

ফাঁকা-প্যাডযুক্ত প্রকারটি ব্যবহার করার সময় বাড়ানো স্টোরেজ স্পেস এবং দৈর্ঘ্য-সীমাবদ্ধ কলামে সঞ্চয় করার সময় দৈর্ঘ্য পরীক্ষা করার জন্য কয়েকটি অতিরিক্ত সিপিইউ চক্র ছাড়াও এই তিন ধরণের মধ্যে পারফরম্যান্সের পার্থক্য নেই। চরিত্রের (এন) কিছু অন্যান্য ডাটাবেস সিস্টেমে পারফরম্যান্স সুবিধা থাকলেও পোস্টগ্রিসএসকিউএলে তেমন কোনও সুবিধা নেই; প্রকৃতপক্ষে অক্ষর (এন) অতিরিক্ত স্টোরেজ ব্যয়ের কারণে সাধারণত তিনটির মধ্যে সবচেয়ে ধীর হয়। বেশিরভাগ পরিস্থিতিতে পরিবর্তে পাঠ্য বা চরিত্র পরিবর্তিত হওয়া উচিত।

আমি সাধারণত পাঠ্য ব্যবহার করি

তথ্যসূত্র: http://www.postgresql.org/docs/current/static/datatype-character.html


23

আমার মতে, varchar(n)এর নিজস্ব সুবিধা রয়েছে। হ্যাঁ, তারা সবাই একই অন্তর্নিহিত ধরণ এবং সেগুলি ব্যবহার করে। তবে, এটি উল্লেখ করা উচিত যে পোস্টগ্রেএসকিউএল এর সূচকগুলির আকার সীমা 2712 বাইট রয়েছে সারি প্রতি ।

টিএল; ডিআর: যদি আপনি কোনও সীমাবদ্ধতা ছাড়াইtext টাইপ ব্যবহার করেন এবং এই কলামগুলিতে সূচক থাকে তবে খুব সম্ভবত আপনার কিছু কলামের জন্য এই সীমাটি চাপিয়ে দেওয়া হয়েছে এবং আপনি যখন তথ্য সন্নিবেশ করার চেষ্টা করছেন তবে ব্যবহারের সাথে ত্রুটি পেয়েছেনvarchar(n) আপনি এটি প্রতিরোধ করতে পারেন।

আরও কিছু বিশদ: এখানে সমস্যাটি হ'ল পোস্টগ্রিএসকিউএল textটাইপ বা 2712 এর চেয়ে বেশি varchar(n)যেখানে ইনডেক্স তৈরি করার সময় কোনও ব্যতিক্রম দেয় না nHowever তবে, 2712 এর বেশি সংকোচিত আকারের একটি রেকর্ড সন্নিবেশ করার চেষ্টা করা হলে এটি ত্রুটি ঘটবে। এর অর্থ আপনি 100.000 অক্ষরের স্ট্রিং সন্নিবেশ করতে পারেন যা পুনরাবৃত্ত অক্ষর দ্বারা সহজেই রচিত হয় কারণ এটি 2712 এর নীচে সংক্ষেপিত হবে তবে আপনি 4000 অক্ষরের সাথে কিছু স্ট্রিং সন্নিবেশ করতে সক্ষম হবেন না কারণ সংকীর্ণ আকারটি 2712 বাইটের চেয়ে বেশি। varchar(n)যেখানে nনেই তা ব্যবহার করে2712-এর চেয়ে বেশি এমন আপনি এই ত্রুটিগুলি থেকে নিরাপদ।


পরে পাঠ্যের জন্য সূচী তৈরির চেষ্টা করার ক্ষেত্রে ত্রুটিগুলি পোস্ট করে কেবল বর্ণের জন্য কাজ করে (সংস্করণ (এন) ছাড়াই)। যদিও এম্বেড থাকা পোস্টগ্রাসের সাথে শুধুমাত্র পরীক্ষিত।
আর্টিং

2
: উল্লেখ করা stackoverflow.com/questions/39965834/... যা পোস্টগ্রি উইকি একটি লিঙ্ক আছে: wiki.postgresql.org/wiki/... , 400GB ম্যাক্স সারি আকার থেকে এটি দেখে মনে হচ্ছে সারি প্রতি বিবৃত 2712 বাইট সীমা ভুল । একটি ডাটাবেসের জন্য সর্বোচ্চ আকার? সীমাহীন (32 টিবি ডাটাবেস বিদ্যমান) একটি টেবিলের জন্য সর্বাধিক আকার? একটি সারির জন্য 32 টিবি সর্বোচ্চ আকার? 400 গিগাবাইট একটি ক্ষেত্রের জন্য সর্বোচ্চ আকার? 1 জিবি একটি সারণিতে সারি সর্বাধিক সংখ্যা? সীমাহীন
বিল ওয়ারথিংটন

@ বিল ওয়ার্নিংটন আপনার পোস্ট করা নম্বরগুলি সূচী রাখার বিষয়টি বিবেচনায় নেই। 2712 বাইট বিটিরির সর্বাধিক সীমা সম্পর্কে, এটি একটি বাস্তবায়ন বিশদ যাতে ডকুমেন্টগুলিতে এটি খুঁজে না পান। তবে, আপনি সহজেই এটি নিজে পরীক্ষা করতে পারেন বা "পোস্টগ্র্যাসকিএল সূচক সারি আকার সূচকের জন্য সর্বাধিক 2712 অতিক্রম করে" অনুসন্ধান করে এটি গুগল করতে পারেন। যেমন।
sotn

আমি PostgeSQL এ নতুন, তাই বিশেষজ্ঞ নই the আমি এমন একটি প্রকল্পে কাজ করছি যেখানে আমি কোনও টেবিলের কলামে সংবাদ নিবন্ধগুলি সঞ্চয় করতে চাই। দেখে মনে হচ্ছে পাঠ্য কলামের ধরণটি আমি ব্যবহার করব। মনে করা হয় যে ওরাকলের মতো একই স্তরের কাছাকাছি থাকা 270 বাইটের মোট সারির আকারটি এমন একটি ডাটাবেসের জন্য খুব কম শোনায়। আমি কি আপনাকে সঠিকভাবে বুঝতে পারি যে আপনি কোনও বৃহত পাঠ্য ক্ষেত্রকে সূচীকরণের জন্য উল্লেখ করছেন? আপনার সাথে চ্যালেঞ্জ বা তর্ক করার চেষ্টা করছেন না, কেবল আসল সীমা বোঝার চেষ্টা করছেন। যদি কোনও সূচক জড়িত না থাকে, তবে কি উইকের মতো সারি সীমাটি 400 গিগাবাইট হবে ?? আপনার দ্রুত সাড়া দেওয়ার জন্য ধন্যবাদ।
বিল ওয়ারথিংটন

1
@ বিল ওয়ারওয়ার্টন সম্পূর্ণ পাঠ্য অনুসন্ধান সম্পর্কে আপনার গবেষণা করা উচিত। এই লিঙ্কটি পরীক্ষা করুন যেমন
সোমেন

18

পাঠ্য এবং বারচরের বিভিন্ন অন্তর্নিহিত ধরণের রূপান্তর রয়েছে। আমি যে সবচেয়ে বড় প্রভাব লক্ষ্য করেছি তা হ'ল পিছনের জায়গাগুলি পরিচালনা করা। উদাহরণ স্বরূপ ...

select ' '::char = ' '::varchar, ' '::char = ' '::text, ' '::varchar = ' '::text

আপনি প্রত্যাশা হিসাবে true, false, trueনা ফিরে true, true, true


এটা কিভাবে সম্ভব? যদি a = b এবং a = c হয় তবে b = c।
লুকাস সিলভা

4

কিছুটা ওটি: আপনি যদি রেলগুলি ব্যবহার করেন তবে ওয়েব পৃষ্ঠাগুলির মানক বিন্যাস আলাদা হতে পারে। ডেটা এন্ট্রি ফর্ম textবাক্সগুলি স্ক্রোলযোগ্য, তবে character varying(রেলগুলি string) বাক্সগুলি এক-লাইন। প্রয়োজন দেখাতে দেখা দর্শনগুলি দীর্ঘ।


2

Http://www.sqlines.com/postgresql/datatypes/text- এর একটি ভাল ব্যাখ্যা :

টেক্সট এবং ভর্চার (এন) এর মধ্যে একমাত্র পার্থক্য হ'ল আপনি কোনও ভর্চার কলামের সর্বাধিক দৈর্ঘ্য সীমাবদ্ধ করতে পারেন, উদাহরণস্বরূপ, ভর্চার (255) 255 অক্ষরের বেশি দীর্ঘ কোনও স্ট্রিং সন্নিবেশ করার অনুমতি দেয় না।

টেক্সট এবং ভর্চার উভয়েরই 1 গিগাবাইটের উপরের সীমা রয়েছে এবং তাদের মধ্যে পারফরম্যান্সের কোনও পার্থক্য নেই (পোস্টগ্রিসএসকিউএল ডকুমেন্টেশন অনুসারে)।


-1

character varying(n), varchar(n)- (উভয় একই) ত্রুটি না বাড়িয়ে মানটি n অক্ষরে ছাঁটা হবে।

character(n), char(n)- (উভয় একই) নির্দিষ্ট দৈর্ঘ্য এবং দৈর্ঘ্যের শেষ অবধি ফাঁকা দিয়ে প্যাড করবে।

text- সীমাহীন দৈর্ঘ্য।

উদাহরণ:

Table test:
   a character(7)
   b varchar(7)

insert "ok    " to a
insert "ok    " to b

আমরা ফলাফল পেতে:

a        | (a)char_length | b     | (b)char_length
----------+----------------+-------+----------------
"ok     "| 7              | "ok"  | 2

5
মাইএসকিউএল যখন কলামের আকারের চেয়ে বেশি হবে তখন নীরবে ডেটা কেটে দেবে, পোস্টগ্রেএসকিউএল না করে এবং "অক্ষর পরিবর্তিত (এন)" ত্রুটির জন্য "একটি দীর্ঘ মান" বৃদ্ধি করবে।
জিএসএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.