ওরাকল-এ ভারচর এবং বর্ণচর 2 এর মধ্যে পার্থক্য কী?


258

ভারচার এবং বর্ণচর 2 এর মধ্যে পার্থক্য কী?


4
এই প্রশ্নটি এই ব্লগ পোস্টটি দ্বারা অনুপ্রাণিত হয়েছিল এমন কোন প্রতিক্রিয়া কী? joelonsoftware.com/articles/GuerrillaInterviewing3.html
জোশুয়া স্নাইডার

উত্তর:


336

এখন হিসাবে, তারা প্রতিশব্দ।

VARCHARস্ট্যান্ডার্ড প্রেসক্রিপশন হিসাবে ভবিষ্যতে ফাঁকা স্ট্রিং এবং Oracleপার্থক্য সমর্থন দ্বারা সংরক্ষিত ।NULLANSI

VARCHAR2একটি NULLএবং খালি স্ট্রিংয়ের মধ্যে পার্থক্য করে না এবং কখনই করবে না।

আপনি যদি খালি স্ট্রিংয়ের উপর নির্ভর করেন এবং NULLএকই জিনিস হয়ে থাকেন তবে আপনার ব্যবহার করা উচিত VARCHAR2


40
এই যুক্তি আগে শুনিনি, এটি কার্যকর useful ধন্যবাদ। রেকর্ডের জন্য, এটি এখনও সম্পূর্ণ হাস্যকর যে ওরাকল-এর মূল চরিত্রটি "বর্ণচর 2"। এই ভয়ঙ্কর ক্লেজ হিসাবে অন্য কাউকে আঘাত করে না? দেখে মনে হচ্ছে প্রোগ্রামটি শেখার প্রথম সপ্তাহে আমি কীভাবে কিছু সমস্যা সমাধান করেছি।
আয়ান বার্লি

7
@ আইয়ান: মূল প্রকারটি হ'ল VARCHAR2কারণ বর্তমানে এমন কোনও ধরণের নেই যা VARCHARউচিত মতো আচরণ করে । আসলে, VARCHARএটি যথাযথভাবে প্রয়োগ না করা অবধি আপনার ব্যবহার করা উচিত নয় ।
কাসনসুই

11
ধন্যবাদ, কুইকস্নোই সুতরাং আমি অনুমান করি যে নির্বোধ অংশটি হ'ল ওরাকলের কাছে অন্য অন্যান্য ডাটাবেসের মতো যথাযথ ভোচারআর নেই? এখানে বোকা কিছু চলছে, আমি এটি সম্পর্কে নিশ্চিত ... :)
ইয়ান ভারালি

11
@ আইয়ান: যখন ওরাকল বিকাশ করা হচ্ছিল, তখন কোনও মান ছিল না। মানগুলির উত্থানের সময় এর মধ্যে ইতিমধ্যে উত্তরাধিকার অ্যাপ্লিকেশনগুলির বোঝা ছিল। এটি কীভাবে ঘটে তা আমরা সবাই জানি।
কাসনসুই

5
দুঃখিত, এটি আসলে @ পরিচিত ছিল যে আমি যে ভুল মন্তব্যটির প্রতিক্রিয়া জানাচ্ছিলাম সেগুলি লিখেছিল । সত্য যে where x is NULLথেকে আয় ভিন্ন ফলাফল where x = ''নেই না মানে NULLএবং ''অন্য কোন উপায়ে বিভিন্ন আছে। =অপারেটরের কারণে ভিন্ন আচরণ হয় ।
ড্যান লেন্সকি 22

38

বর্তমানে ভর্চার আরচারার মতোই আচরণ করে। তবে, প্রকারটি VARCHARব্যবহার করা উচিত নয় কারণ এটি ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত।

গৃহীত হয়েছে: পার্থক্য, পার্থক্য


@ ফিলিপরেগো VARCHARব্যবহার করা উচিত নয়। আমি এটি সম্পাদনা করেছি
বুগবুনি

29

সর্বশেষতম স্থিতিশীল ওরাকল উত্পাদন সংস্করণ 12.2 থেকে নেওয়া: ডেটা টাইপ

প্রধান পার্থক্য হ'ল এটি VARCHAR2একটি অভ্যন্তরীণ ডাটা টাইপ এবং VARCHARএটি একটি বাহ্যিক ডেটা টাইপ । সুতরাং আমাদের অভ্যন্তরীণ এবং বাহ্যিক ডেটা ধরণের মধ্যে পার্থক্য বুঝতে হবে ...

একটি ডাটাবেসের ভিতরে মানগুলি সারণীতে কলামগুলিতে সঞ্চিত থাকে। অভ্যন্তরীণভাবে, ওরাকল অভ্যন্তরীণ ডেটা ধরণের হিসাবে পরিচিত বিশেষ ফরম্যাটে ডেটা উপস্থাপন করে ।

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

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

VARCHAR2ডাটা টাইপ 4000 বাইটের সর্বাধিক দৈর্ঘ্য সঙ্গে অক্ষরের একটি পরিবর্তনশীল দৈর্ঘ্যের স্ট্রিং। যদি init.ora পরামিতি ম্যাক্স_স্ট্রিং_সাইজটি ডিফল্ট হয় তবে এর সর্বোচ্চ দৈর্ঘ্য VARCHAR24000 বাইট হতে পারে। যদি init.ora পরামিতি সর্বোচ্চ_ স্ট্রিং_সাইজ = প্রসারিত হয় তবে এর সর্বোচ্চ দৈর্ঘ্য VARCHAR232767 বাইট হতে পারে

VARCHARদৈর্ঘ্য তারতম্য এর ডাটা টাইপ দোকানে অক্ষর স্ট্রিং। প্রথম 2 বাইটে অক্ষরের স্ট্রিংয়ের দৈর্ঘ্য থাকে এবং বাকী বাইটগুলিতে স্ট্রিং থাকে। একটি বাঁধাই বা একটি সংজ্ঞায়িত কলটিতে স্ট্রিংয়ের নির্দিষ্ট দৈর্ঘ্যে অবশ্যই দুটি দৈর্ঘ্য বাইট অন্তর্ভুক্ত করা উচিত, তাই VARCHARপ্রাপ্ত বা প্রেরণযোগ্য বৃহত্তম স্ট্রিং 65533 বাইট দীর্ঘ, 65535 নয়।

একটি 12.2 ডাটাবেসের মধ্যে একটি দ্রুত পরীক্ষা দাড়ায় যে একটি হিসাবে অভ্যন্তরীণ ডাটা টাইপ , ওরাকল এখনও একটি একইরূপে VARCHARহিসেবে pseudotype জন্য VARCHAR2। এটি এমনটি নয় SYNONYMযা ওরাকলে একটি আসল অবজেক্টের ধরণ।

SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production    

SQL> create table test (my_char varchar(20));
Table created.

SQL> desc test
Name                 Null?    Type
MY_CHAR                       VARCHAR2(20)

VARCHARপ্রোসি / সি ++ প্রম্পম্পাইলার বিকল্পগুলির জন্য কিছু নিদর্শন রয়েছে। যারা প্রোগ্রামার আগ্রহী তাদের জন্য লিঙ্কটি এখানে রয়েছে: প্রো * সি / সি ++ প্রোগ্রামার গাইড


1
সুতরাং এর অর্থ কি VARCHARএখনও আচরণ করে '' == null?

2
হ্যাঁ. উপরের অভ্যন্তরীণ বনাম বাহ্যিক প্রকারের আলোচনা ওসিআই রেফারেন্স থেকে। 12.2 এসকিউএল ভাষা রেফারেন্স এখনো বহন করে একই বিবৃতিতে এটা সবসময় VARCHAR জন্য ছিল 'ব্যবহার করবেন না'।
উইলিয়াম রবার্টসন

এই কারণেই আমি ওসিআই পার্থক্যগুলি নিয়ে আলোচনা করেছি, অন্যথায় এটি ভবিষ্যতের ব্যবহারের জন্য অনেকটা সংরক্ষিত বা তারা বলে 'ভেরিয়েবল দৈর্ঘ্য' যা সম্ভবত বহু-বাইট ইউটিএফ 8 এর মতো চরিত্র সেটগুলিতে ইঙ্গিত করছে ...
স্যান্ডম্যান

1
আপনি দেখিয়েছেন যে ভোরচারার হিসাবে ঘোষিত মানগুলি ভিচারআর 2 হিসাবে ডাটাবেজে সংরক্ষিত থাকে তবে ভারচারের সর্বাধিক দৈর্ঘ্য (65533 বাইট) ভর্চারা 2-এর সর্বোচ্চ দৈর্ঘ্য (32767 বাইট) এর চেয়ে বেশি। ডাটাবেস কীভাবে এটি পরিচালনা করে?
পাইটর ডব্রোগোস্ট

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

2

কিছু পরীক্ষা-নিরীক্ষার পরে (নীচে দেখুন), আমি নিশ্চিত করতে পারি যে সেপ্টেম্বর 2017 পর্যন্ত গ্রহণযোগ্য উত্তরে বর্ণিত কার্যকারিতার সাথে কিছুই পরিবর্তন হয়নি : -

  1. ওরাকল 11g জন্য Rextester ডেমো: খালি স্ট্রিং হিসাবে প্রবেশ করানো হয়NULLউভয়ের জন্য গুলিVARCHAR এবংVARCHAR2
  2. ওরাকল 12 সি এর জন্য লাইভএসকিউএল ডেমো: একই ফলাফল।

এই দুটি কীওয়ার্ডের historicalতিহাসিক কারণটি একটি ভিন্ন প্রশ্নের উত্তরে ভালভাবে ব্যাখ্যা করা হয়েছে ।


0
  1. VARCHAR 2000 বাইট অব অক্ষর সংরক্ষণ করতে পারে যখন VARCHAR2 4000 বাইট অক্ষর সংরক্ষণ করতে পারে।

  2. আমরা যদি ডেটাটাইপটিকে ভোরচার হিসাবে ঘোষণা করি তবে এটি ন্যূনুয়াল মানগুলির জন্য স্থান দখল করবে। VARCHAR2 ডেটাটাইপের ক্ষেত্রে এটি NULL মানগুলির কোনও স্থান দখল করবে না। যেমন,

    name varchar(10)

নামটি 'রবি__' হলেও, মেমরির 6 বাইট রিজার্ভ করবে whereas

name varchar2(10) 

ইনপুট স্ট্রিংয়ের দৈর্ঘ্য অনুসারে স্থান সংরক্ষণ করবে। যেমন, 'রবি__' এর জন্য মেমরির 4 বাইট।

এখানে _ NULL প্রতিনিধিত্ব করে।

দ্রষ্টব্য: বার্চার নাল মানগুলির জন্য স্থান সংরক্ষণ করবে এবং ভারচার 2 নাল মানগুলির জন্য কোনও স্থান সংরক্ষণ করবে না।


2
আমি এই উত্তর বিভ্রান্তিকর হয় মনে VARCHARসঙ্গে CHAR
জন হেলার

0

বর্তমানে, তারা একই রকম। তবে আগে

  1. কোথাও নেট, আমি পড়লাম যে,

VARCHARNULLভবিষ্যতে খালি স্ট্রিংয়ের মধ্যে পার্থক্য এবং খালি স্ট্রিংকে সমর্থন করার জন্য ওরাকল দ্বারা সংরক্ষিত রয়েছে , যেমন এএনএসআই স্ট্যান্ডার্ড নির্দেশ দেয়।

VARCHAR2একটি NULLএবং খালি স্ট্রিংয়ের মধ্যে পার্থক্য করে না এবং কখনই করবে না।

  1. এছাড়াও,

Emp_name varchar(10)- আপনি যদি 10 টিরও কম সংখ্যার মান প্রবেশ করেন তবে অবশিষ্ট স্থানটি মুছে ফেলা যাবে না। এটিতে মোট 10 টি স্পেস ব্যবহার করা হয়েছিল।

Emp_name varchar2(10) - আপনি যদি 10 টিরও কম সংখ্যার মান লিখেন তবে অবশিষ্ট স্থান স্বয়ংক্রিয়ভাবে মোছা হবে


আমি সম্প্রতি এই পোস্টে হোঁচট খেয়েছি, দয়া করে নোট করুন যে এটি ভুল। নিম্নলিখিতটি কার্যকর করুন এবং উভয় ক্ষেত্রটি 3 টি অক্ষর হবে:create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
ব্রায়ান লিচ

-1

VARCHAR VARCHAR2 এর প্রতিশব্দ। যাইহোক, আপনার VitcAR ব্যবহার করা উচিত নয় কারণ ওরাকল ভবিষ্যতে এর শব্দার্থবিজ্ঞান পরিবর্তন করতে পারে।

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