এসকিউএল সার্ভারে চর, এনচার, বারচার এবং এনভারচরের মধ্যে পার্থক্য কী?


622

বলতে কী বোঝায় nvarchar ?

মধ্যে পার্থক্য কি char, nchar, varchar, এবং nvarcharSQL সার্ভার কি?

উত্তর:


856

কেবল সাফ করার জন্য ... বা সংক্ষেপে ...

  • ncharএবং ইউনিকোড অক্ষর nvarcharসংরক্ষণ করতে পারেন ।
  • charএবং ইউনিকোড অক্ষর সংরক্ষণ করতে পারে নাvarchar
  • charএবং ncharহয় নির্দিষ্ট দৈর্ঘ্য যা হবে স্টোরেজ স্পেস রিজার্ভ অক্ষরের সংখ্যা জন্য এমনকি আপনি যদি সব কিছু স্থান ব্যবহার করবেন না আপনি উল্লেখ করুন।
  • varcharএবং nvarcharহয় পরিবর্তনশীল দৈর্ঘ্যের যা শুধুমাত্র আপনি যে অক্ষরগুলি সংরক্ষণ জন্য স্পেস আপ ব্যবহার করবে। এটি বা মত সংরক্ষণের সংরক্ষণ করবে নাcharnchar

ncharএবং nvarcharদ্বিগুণ স্টোরেজ স্পেস গ্রহণ করবে, সুতরাং আপনার যদি ইউনিকোড সমর্থন প্রয়োজন হয় তবেই সেগুলি ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে ।


15
চর এবং ভারচারটি ইউনিকোড সঞ্চয় করার জন্য নয়, তবে কিছু অতিরিক্ত কোডিং ট্রিকস এবং অতিরিক্ত যুক্তি দিয়ে আপনি এখনও ইউনিকোড স্টোরেজের জন্য [বার] চর ক্ষেত্রটির অপব্যবহার করতে পারেন।
উইম টেন ব্রিংক


7
স্টোরেজ সংরক্ষণের সুবিধা কী?
mlissner

4
শেষ পয়েন্টে: ইউনিকোড এনসিআর এবং এনভারচার ব্যবহার করা বেশিরভাগ ক্ষেত্রেই আরও ভাল, আরও ভাল কোলেশন, ব্যবহারকারীর জন্য নমনীয়তা, ভবিষ্যতের সামঞ্জস্যতার সমস্যাগুলি সরিয়ে দেয়। এবং
যাইহোক

6
@ বেনকেইন চর (২০) ২০ বাইট ব্যবহার করবে (একটি 8-বিটের সমষ্টি গ্রহণ করে); ভ্যাচার (২০) লেন (ডেটা) +২ বাইট ব্যবহার করবে, অর্থাত্ 20 বাইটের ডেটার জন্য 22, তবে 10 বাইটের জন্য 12 টি ব্যবহার করবে। অতিরিক্ত দুটি বাইট দৈর্ঘ্যের রেকর্ড। যদি আপনার ডেটা সর্বদা পূর্ণ দৈর্ঘ্য হয় তবে একটি চর ব্যবহার করুন, কারণ এটি স্থান সংরক্ষণ করে এবং আরও দ্রুত হতে পারে। দয়া করে কখনও কোনও ভার্চর (1), বা প্রকৃতপক্ষে বর্ণচর (4) এর চেয়ে ছোট কিছু ব্যবহার করবেন না। বার্চর বিন্যাসের একটি একক অক্ষর তিনটি বাইট ব্যবহার করে, তাই একটি চর (3) কখনই বার্চারের (3) এর চেয়ে বেশি স্থান ব্যবহার করবে না।
রিচার্ড গ্যাডসডেন 15

95

এখন পর্যন্ত সমস্ত উত্তর ইঙ্গিত করে যে varcharএকক বাইট, nvarchar ডাবল বাইট হয়। এর প্রথম অংশটি নীচে চিত্রিত হিসাবে কোলেশন উপর নির্ভর করে

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

রিটার্নস

এখানে চিত্র বর্ণনা লিখুন

নোট করুন এবং সংস্করণগুলিতে অক্ষরগুলি এখনও উপস্থাপিত হয়নি VARCHARএবং নীরবে পরিবর্তিত হয়েছিল ?

আসলে এখনও এমন কোনও চীনা অক্ষর নেই যা সেই জোটে একক বাইট দ্বারা পুনরুদ্ধার করা যায়। কেবলমাত্র একক বাইট অক্ষরগুলি সাধারণত পশ্চিমা ASCII সেট।

এই কারণে এটি একটি থেকে একটি সন্নিবেশ জন্য সম্ভব nvarchar(X)একটি কলাম varchar(X)কলাম একটি ছাঁটাই ত্রুটি সহ ব্যর্থ (যেখানে এক্স একটি সংখ্যা উভয় স্থানেই একই নির্দেশ)।

এসকিউএল সার্ভার 2012 এসসি (পরিপূরক চরিত্র) যোগ করে যা সমর্থন করে UTF-16। এই সংগ্রহগুলিতে একটি একক nvarcharঅক্ষর 2 বা 4 বাইট নিতে পারে।


4
আমি যে ধরণের উত্তর খুঁজছিলাম। আমার পছন্দগুলিতে সময় সাশ্রয় করতে - অ-ইংরেজি পাঠ্য অনুবাদ করে "গণপ্রজাতন্ত্রী চীন" এর অনুবাদ অনুবাদ.
com.com/#auto/en/…

34

এনচার এবং চরটি একে অপরের মতো ঠিক একইভাবে কাজ করে, যেমন এনভারচর এবং ভারচার। তাদের মধ্যে কেবলমাত্র পার্থক্যটি হ'ল এনচার / এনভারচর ইউনিকোড অক্ষরগুলি সংরক্ষণ করুন (আপনার যদি বর্ধিত অক্ষর সেটগুলির ব্যবহারের প্রয়োজন হয় তবে ভার্চর না করে)।

ইউনিকোড অক্ষরগুলির জন্য আরও স্টোরেজ প্রয়োজন, এনসিআর / এনভারচার ক্ষেত্রগুলি দ্বিগুণ স্থান গ্রহণ করে (সুতরাং উদাহরণস্বরূপ এসকিউএল সার্ভারের পূর্ববর্তী সংস্করণগুলিতে কোনও এনভারচার ক্ষেত্রের সর্বাধিক আকার 4000)।

এই প্রশ্নের অনুরূপ এই এক


3
আপনি একটি জিনিস ভুলে গেছেন: এনসিআর একটি নির্দিষ্ট দৈর্ঘ্য ব্যবহার করে তাই এনচার (10) সর্বদা দশটি অক্ষর গ্রহণ করা প্রয়োজন। এবং ভারচার (10) প্রকৃতপক্ষে ইউনিকোড এবং 10 অক্ষর অবধি যে কোনও সংখ্যক অক্ষর গ্রহণ করবে। এছাড়াও এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms186939.aspx দেখুন
উইম টেন ব্রিঙ্ক

33

কেবল আরও কিছু যুক্ত করতে: এনসিএআর - ডেটাতে ট্রেলিং স্পেস যুক্ত করে। এনভারচর - ডেটাতে ট্রেলিং স্পেস যুক্ত করে না।

সুতরাং, আপনি যদি একটি 'এনসিআর' ক্ষেত্রের দ্বারা আপনার ডেটাসেটটি ফিল্টার করতে চলেছেন তবে স্থানগুলি সরাতে আপনি আরটিআরআইএম ব্যবহার করতে চাইতে পারেন। উদাহরণস্বরূপ NChar (10) ক্ষেত্রটি ব্র্যান্ড বলে NIKE শব্দটি সঞ্চয় করে। এটি শব্দের ডানদিকে 6 স্পেস যুক্ত করে। সুতরাং, ফিল্টার করার সময়, অভিব্যক্তিটি পড়তে হবে: আরটিআরআইএম (ক্ষেত্রগুলি! BRAND.Value) = "NIKE"

আশা করি এটি কাউকে সাহায্য করবে কারণ আমি এখনই কিছুটা লড়াই করে যাচ্ছিলাম!


24

বিদ্যমান উত্তরগুলি সংক্ষিপ্ত করে সংশোধন করার আমার প্রচেষ্টা:

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

দ্বিতীয়টি বোঝার প্রধান বিষয়টি হ'ল, ncharএবং nvarcharস্ট্রিংগুলি অক্ষর প্রতি ঠিক দুটি বাইট ব্যবহার করে charএবং যেখানে storevarchar কোলেশন কোড পৃষ্ঠা দ্বারা নির্ধারিত একটি এনকোডিং ব্যবহার করুন, যা সাধারণত অক্ষর প্রতি ঠিক এক বাইট হবে (যদিও ব্যতিক্রমগুলি নীচে দেখুন)। চরিত্র প্রতি দুই বাইট ব্যবহার করে, অক্ষরের একটি খুব চওড়া পরিসীমা, সংরক্ষণ করা যেতে পারে তাই এখানে মনে রাখা মৌলিক জিনিস যে ncharএবং nvarcharযখন আপনি আন্তর্জাতিকীকরণ সমর্থন, যা আপনি সম্ভবত চান একটি অনেক ভালো পছন্দ হতে থাকে।

কিছু সূক্ষ্ম পয়েন্ট জন্য এখন।

প্রথমে ncharএবং nvarcharকলামগুলি সর্বদা ইউসিএস -২ ব্যবহার করে ডেটা সঞ্চয় করে। এর অর্থ হ'ল অক্ষর প্রতি ঠিক দুটি বাইট ব্যবহার করা হবে এবং বেসিক বহুভাষিক সমতল (বিএমপি) এর যে কোনও ইউনিকোড অক্ষর একটি ncharবা nvarcharক্ষেত্রের দ্বারা সংরক্ষণ করা যেতে পারে । তবে, এটি কোনও ক্ষেত্রেই নয় ইউনিকোড অক্ষর সংরক্ষণ করা যায় এমনটি নয়। উদাহরণস্বরূপ, উইকিপিডিয়া অনুসারে, মিশরীয় হায়ারোগ্লাইফসের কোড পয়েন্টগুলি বিএমপির বাইরে পড়ে। সুতরাং, ইউনিকোড স্ট্রিংগুলি ইউটিএফ -8 এবং অন্য সত্যিকারের ইউনিকোড এনকোডিংগুলিতে উপস্থাপন করা যেতে পারে যা এসকিউএল সার্ভার ncharবা nvarcharক্ষেত্রে সংরক্ষণ করা যায় না এবং মিশরীয় হায়ারোগ্লাইফগুলিতে লেখা স্ট্রিংগুলি তাদের মধ্যে থাকবে। ভাগ্যক্রমে আপনার ব্যবহারকারীরা সম্ভবত সেই স্ক্রিপ্টটিতে লিখবেন না, তবে এটি মনে রাখার মতো কিছু!

অন্য পোস্টারগুলি হ'ল আরেকটি বিভ্রান্তিকর তবে আকর্ষণীয় বিষয় char এবং varcharকোলেশন কোড পৃষ্ঠাটির প্রয়োজন হলে ক্ষেত্রগুলি নির্দিষ্ট অক্ষরগুলির জন্য অক্ষর প্রতি দুটি বাইট ব্যবহার করতে পারে। (মার্টিন স্মিথ একটি দুর্দান্ত উদাহরণ দিয়েছেন যাতে তিনি দেখায় যে কীভাবে চাইনিজ_ট্রেডিশনাল_স্রোত_আর্ডার_100_CS_AS_KS_WS এই আচরণটি প্রদর্শন করে it এটি দেখুন।)

আপডেট: এসকিউএল সার্ভার ২০১২-এর হিসাবে, অবশেষে ইউটিএফ -১ for এর জন্য কোড পৃষ্ঠা রয়েছে , উদাহরণস্বরূপ লাতিন 1_ জেনারাল_০০_সিআই_এএসএসসি, যা সত্যই পুরো ইউনিকোডের পরিধি আবরণ করতে পারে।


14
  • char: সর্বাধিক 8000 অক্ষরের দৈর্ঘ্য সহ স্থির দৈর্ঘ্যের অক্ষর ডেটা।
  • nchar: সর্বাধিক 4000 অক্ষরের দৈর্ঘ্য সহ স্থির দৈর্ঘ্যের ইউনিকোড ডেটা।
  • Char = 8 বিট দৈর্ঘ্য
  • NChar = 16 বিট দৈর্ঘ্য

char8-বিট দৈর্ঘ্য থাকতে পারে না। এটি দৈর্ঘ্য সংরক্ষণ করতে হবে না, এবং নির্দিষ্ট দৈর্ঘ্য 8000 অক্ষর পর্যন্ত হতে পারে।
জন বি ল্যাম্বে

12

nchar[(n)] (জাতীয় চরিত্র)

  • স্থির দৈর্ঘ্যের ইউনিকোড স্ট্রিং ডেটা।
  • n স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণ করে এবং এটি 1 থেকে 4,000 এর মধ্যে একটি মান হতে হবে।
  • স্টোরেজের আকার দুই গুণ nবাইট।

nvarchar [(n | max)] (জাতীয় চরিত্র পরিবর্তিত হয়।)

  • পরিবর্তনশীল দৈর্ঘ্যের ইউনিকোড স্ট্রিং ডেটা।
  • n স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণ করে এবং 1 থেকে 4,000 এর মধ্যে মান হতে পারে।
  • max ইঙ্গিত দেয় যে সর্বাধিক স্টোরেজ আকার 2 ^ 31-1 বাইট (2 গিগাবাইট)।
  • বাইটে স্টোরেজের আকার +2 বাইটে প্রবেশ করা ডেটার প্রকৃত দৈর্ঘ্যের দ্বিগুণ

char [(n)] (চরিত্র)

  • স্থির দৈর্ঘ্য, non-Unicodeস্ট্রিং ডেটা।
  • n স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণ করে এবং এটি 1 থেকে 8,000 এর মধ্যে একটি মান হতে হবে।
  • স্টোরেজ সাইজ nবাইট হয়।

varchar [(n | max)] (চরিত্রের ভিন্নতা)

  • চলক দৈর্ঘ্য, অ-ইউনিকোড স্ট্রিং ডেটা।
  • n স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণ করে এবং 1 থেকে 8,000 এর মধ্যে মান হতে পারে।
  • max ইঙ্গিত দেয় যে সর্বাধিক স্টোরেজ আকার 2 ^ 31-1 বাইট (2 গিগাবাইট)।
  • স্টোরেজের আকার হ'ল + 2 বাইট প্রবেশ করা ডেটার আসল দৈর্ঘ্য।

7

পার্থক্যগুলি হ'ল:

  1. n [var] চর ইউনিকোড সংরক্ষণ করে [var] চর কেবল একক বাইট অক্ষর সংরক্ষণ করে।
  2. [n] চরটির জন্য নির্দিষ্ট দৈর্ঘ্যের একটি নির্দিষ্ট সংখ্যক অক্ষর প্রয়োজন হয় যখন [n] বর্ণচর নির্ধারিত দৈর্ঘ্য সহ এবং অক্ষরগুলির একটি চলক সংখ্যা গ্রহণ করে।

আর একটি পার্থক্য দৈর্ঘ্য। এনসিআর এবং এনভারচার উভয়ই 4,000 অক্ষর পর্যন্ত দীর্ঘ হতে পারে। এবং চর এবং বর্ণচর 8000 অক্ষর পর্যন্ত দীর্ঘ হতে পারে। তবে এসকিউএল সার্ভারের জন্য আপনি এমন একটি [এন] বার্চার (সর্বোচ্চ) ব্যবহার করতে পারেন যা 2,147,483,648 টি অক্ষর পর্যন্ত পরিচালনা করতে পারে। (দুটি গিগাবাইট, স্বাক্ষরিত 4-বাইট পূর্ণসংখ্যা


7

nchar nvarchar চেয়ে আরও স্থান প্রয়োজন ।

যেমন,

একটি এনসিআর (100) সর্বদা 100 টি অক্ষর সংরক্ষণ করবে এমনকি আপনি কেবল 5 টি প্রবেশ করলেও বাকী 95 টি অক্ষর শূন্যস্থান দিয়ে প্যাড করা হবে। একটি nvarchar (100) এ 5 টি অক্ষর সংরক্ষণ করলে 5 টি অক্ষর সাশ্রয় হবে।


6
সম্পূর্ণ সত্য নয়, যেহেতু আপনার জন্য 100 টি পর্যন্ত অক্ষর সহ একটি চর (100) পূরণ করা প্রয়োজন। আপনি যখন এটি ব্যবহার করবেন উদাহরণস্বরূপ আপনার ডাটাবেসে ফোন নম্বর সংরক্ষণ করুন বা একটি নির্দিষ্ট দৈর্ঘ্যের সাথে নম্বরগুলি অর্ডার করুন। ক্ষেত্রের দৈর্ঘ্য স্থির হওয়ার কারণে আপনার সর্বোচ্চ অক্ষরের সংখ্যা পূরণ করার কোনও বিকল্প নেই। তবে যখন আপনার সমস্ত ডেটা রেকর্ডের জন্য 100 টি অক্ষর, একটি চর (100) বার্চারের চেয়ে কম সঞ্চয়স্থান গ্রহণ করবে (100) কারণ এটির দৈর্ঘ্যের ইঙ্গিতের প্রয়োজন নেই: প্রতিটি মান হ'ল 100 অক্ষর।
উইম টেন ব্রিংক

5

এনসিআর (10) দৈর্ঘ্যের একটি নির্দিষ্ট দৈর্ঘ্যের ইউনিকোড স্ট্রিং n দৈর্ঘ্য যদি পৃথক হয়।


ভুল তুলনা - প্রশ্ন nchar এবং বর্ণের সাথে সম্পর্কিত, nchar এবং nvarchar না।
লুক বনেট

4
  • এনসিআর নির্দিষ্ট দৈর্ঘ্যের এবং ইউনিকোড অক্ষর ধারণ করতে পারে। এটিতে প্রতিটি চরিত্রের দুটি বাইট স্টোরেজ ব্যবহার করা হয়।

  • ভার্চার পরিবর্তনশীল দৈর্ঘ্যের এবং ইউনিকোড অক্ষর ধারণ করতে পারে না। এটি প্রতি অক্ষরে একটি বাইট স্টোরেজ ব্যবহার করে।


ভুল। ইউনিকোড প্রতিটি চরিত্রের জন্য 1 থেকে 4 বাইট (সাধারণভাবে) ব্যবহার করতে পারে। এছাড়াও, একটি বার্চার ইউনিকোড ধারণ করতে পারে তবে এটি ইউনিকোড হিসাবে স্বীকৃত নয়। ফলস্বরূপ, কোনও বার্চার ইউনিকোড স্টোরেজের জন্য অবিশ্বাস্য হিসাবে বিবেচিত হয়। (বিশেষত যেহেতু যে ঝুঁকি আছে যে ক্ষেত্রটি অ্যাক্সেস করে এমন কোডটি এটি ভুলভাবে অনুবাদ করবে))
উইম টেন ব্রিঙ্ক

@ অ্যালেক্স: আমি মনে করি আপনি আপনার বক্তব্য তৈরি করেছেন তবে আমি এখনও আপনার সাথে একমত নই। আপনি যেটা বলছেন তা হ'ল লম্বাটি 2 ^ 32 এর চেয়ে ছোট হতে পারে তবে কোনও ইনট একটি দীর্ঘ সময় ধরে রাখতে পারে। এটি কেবল 'অবিশ্বাস্য' নয়, এটি একটি অন্তর্নিহিত সীমাবদ্ধতা যা পুরো মান সীমাটি আবরণ করা অসম্ভব করে তোলে।
মানু

4
@ ওয়ার্কশপ অ্যালেক্স: ভুল। ইউনিকোড যেমন এনকোড UCS-2(যা SQL সার্ভার দ্বারা ব্যবহৃত এনকোডিং হতে হবে) প্রতিটি অক্ষর সঞ্চয় করে ঠিক দুই বাইট, দেখতে msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)। এসকিউএল সার্ভার 2008 SCSU কম্প্রেশন ব্যবহার করতে পারেন, কিন্তু এখনও UCS-2 এনকোড ইউনিকোড স্ট্রিং কম্প্রেশন হল: msdn.microsoft.com/en-us/library/ee240835.aspx
রেমাস Rusanu

2

এনভিচারার ইউনিকোড অক্ষর সংরক্ষণ করতে পারে এবং প্রতিটি চরিত্রের জন্য 2 বাইট নেয়।


1
ভুল! ইউনিকোডে প্রতিটি চরিত্রের জন্য 1 থেকে 4 বাইট ব্যবহার হয়! অনেকেই ভুলে যান! এমনকি ইউটিএফ -16 ব্যবহারের ফলে কিছু অক্ষর 2 এর পরিবর্তে 4 বাইট নেবে, যদিও সাধারণ দৈর্ঘ্য 2 বাইট হবে। ইউনিকোডের কয়েকটি অন্যান্য সাবফর্ম্যাটগুলি 4 বাইটেরও বেশি সময় নিতে পারে!
উইম টেন ব্রিংক

7
@ উইমেনব্রিংক - প্রশ্নটি এসকিউএল সার্ভার সম্পর্কে এবং nvarcharসর্বদা অক্ষরে 2 বাইট লাগে।
মার্টিন স্মিথ

@ উইম, আপনি সঠিক যে ইউনিকোডের জন্য বেশ কয়েকটি এনকোডিং রয়েছে যা বিভিন্ন সংখ্যক বাইট তৈরি করতে পারে। তবে এসকিউএল সার্ভার আপনাকে ইউনিকোড এনকোডিং সম্পর্কে কোনও পছন্দ দেয় না। এসকিউএল সার্ভার ২০১২ এর আগে কেবল ইউসিএস -২ ব্যবহার করেছিল, দুটি বাইট প্রশস্ত, সুতরাং মার্টিন উত্তর লেখার সময় সঠিক ছিল। উপরের অন্যান্য উত্তরগুলি যেমন বলেছে, এসকিউএল সার্ভার ২০১২ এখন ইউটিএফ -১ provides সরবরাহ করে, তাই অনেকগুলি অক্ষরের (ইউনিকোড বেসিক বহুভাষিক সমতল) যারা রয়েছে তাদের জন্য দুটি বাইট, অন্যদের জন্য চারটি বাইট সরবরাহ করে।
কংক্রিট গণেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.