কেন আমাদের মাইক্রোসফ্ট এসকিউএল সার্ভারে স্ট্রিংয়ের আগে এন লাগানো দরকার?


34

আমি টি এসকিউএল শিখছি। আমি যে উদাহরণগুলি দেখেছি সেগুলি থেকে, কোনও varchar()ঘরে পাঠ্য সন্নিবেশ করানোর জন্য , আমি কেবল sertোকানোর জন্য স্ট্রিং লিখতে পারি, তবে nvarchar()কোষগুলির জন্য , প্রতিটি উদাহরণ এন অক্ষরের সাথে স্ট্রিংগুলির উপসর্গ করে

আমি সারণি রয়েছে এমন একটি টেবিলে নিম্নলিখিত কোয়েরিটি চেষ্টা করেছিলাম nvarchar(), এবং এটি ঠিকঠাক কাজ করে, সুতরাং উপসর্গ N প্রয়োজন হয় না:

insert into [TableName] values ('Hello', 'World')

আমি যে প্রতিটি উদাহরণ দেখেছি তার সাথে স্ট্রিংগুলি N এর সাথে উপসর্গ করা কেন?

এই উপসর্গটি ব্যবহারের পক্ষে কি কি?


আক্ষরিক স্ট্রিংয়ের জন্য কেবল এন প্রয়োজন হয় না?
ইয়েন ইন ওয়েইন

পোলিশ হ'ল লাতিন ভিত্তিক ভাষা ????
Heckflosse_230

2
N"জাতীয় পরিবর্তিত চরিত্র" এর মতো জাতীয় অর্থ, সমতুল্য এএনএসআই এসকিউএল ডেটা প্রকারগুলি দেখুন
এরিক

আমি এই প্রশ্নের সাথে একমত এবং এ পর্যন্ত কেউ এর উত্তর দেয়নি, এএএএফসিটি। হতে পারে এটি হিসাবে পুনঃস্থাপন করা যেতে পারে " যখন আমার স্ট্রিং আক্ষরিক ASCII VARCHARহয় NVARCHARতখন এসকিউএলকে স্পষ্টতই আমার রূপান্তর করতে দেওয়া কেন খারাপ ?"।
বিনকি

এই প্রশ্নটি ইতিমধ্যে এখানে জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছিল: বারচর এবং এনভারচরের মধ্যে পার্থক্য কী?

উত্তর:


27

এনভারচার ইউনিকোডের জন্য ব্যবহৃত হয়। যদি আপনার ডাটাবেসটি বহুভাষিক ডেটা সংরক্ষণ না করে তবে আপনি ভারচার ব্যবহার চালিয়ে যেতে পারেন। উদাহরণ হিসাবে: N'abc'কেবল আপনার স্ট্রিংটিকে ইউনিকোডে রূপান্তর করে।


2
তখন আপনাকে N এর পরিবর্তে ইউ এর সাথে উপসর্গ করতে হবে না কেন?
আটটিলা কুন

অনুমান হিসাবে স্বাক্ষরিত হওয়ার কারণে আপনি বিভ্রান্ত হতে পারেন
জেবি কিং

U&'abc'ইউনিকোড স্ট্রিং নির্দিষ্ট করার সঠিক উপায়। দেখুন এসকিউএল 2003 বিএনএফ
ceving

2
এন আসলে "জাতীয় ভাষা চরিত্র" সেট।
মাইক বোভেনল্যান্ডার

23

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

আপনার স্ট্রিংয়ের সামনে এন স্থাপন করা নিশ্চিত করে যে এনভারচার কলামে রাখার আগে অক্ষরগুলি ইউনিকোডে রূপান্তরিত হয়। বেশিরভাগ সময় আপনি এন বন্ধ রেখে ঠিক থাকবেন, তবে আমি এটির প্রস্তাব দেব না। দুঃখের চেয়ে নিরাপদ থাকা অনেক ভাল।


3
কেবলমাত্র একটি স্পষ্টতা: "ডিফল্টরূপে" এসকিউএল সার্ভারটি বর্ণচর ক্ষেত্রের সমান্তরালে অনুরূপ এনকোডিংটি ব্যবহার করে, যা ক্ষেত্রটি তৈরির সময় সাধারণত আপনার উদাহরণের জন্য ডিফল্ট সংযোগের উপর ভিত্তি করে ওভারিডেবল able আপনার উদাহরণের জন্য ডিফল্ট কলেজটি ইনস্টল করার সময় সেট করা যেতে পারে, তবে সাধারণত সিস্টেম ডিফল্ট লোকালের সিপি_এসিপি-র সাথে সম্পর্কিত। এটি ইউএস-ইংলিশ মেশিনে উইন্ডোজ 1252 হবে, তবে জাপানের সিস্টেমের লোকেলযুক্ত একটি মেশিনে 932, রাশিয়ান মেশিনে 1251, ইত্যাদি গল্পটির নৈতিকতা কী? এনভারচার ব্যবহার করুন :)
জেসনট্রু

1
এখন পর্যন্ত এটিই একমাত্র উত্তর যা "এসকিউএল অন্তর্নিহিতভাবে ট্রান্সকোড করবে সেহেতু আক্ষরিক স্ট্রিংগুলিতে এন উপসর্গটি কেন ব্যবহার করবে?" এই প্রশ্নটিকেই সম্বোধন করে। অন্যান্য উত্তরগুলি সমস্ত একটি পৃথক প্রশ্নের জন্য "এনভারচার বনাম ভারচারের মধ্যে পার্থক্য কী?"
টিম্বো

18

কারণ এমএস এসকিউএল সার্ভারের অন্যান্য আরডিবিএমএসের তুলনায় ইউটিএফ -8 এর জন্য খুব কম সমর্থন রয়েছে।

এমএস এসকিউএল সার্ভার কনভেনশনটি অনুসরণ করে, উইন্ডোজের মধ্যেই ব্যবহৃত হয় যে "সরু" স্ট্রিংগুলি ( charসি ++ CHARবা VARCHARএসকিউএল মধ্যে) একটি উত্তরাধিকার "কোড পৃষ্ঠা" এ এনকোড করা হয়। কোড পৃষ্ঠাগুলি নিয়ে সমস্যাটি হ'ল তাদের সীমিত সংখ্যক অক্ষর রয়েছে (বেশিরভাগ একক-বাইট এনকোডিংগুলি, যা প্রতিবেদককে 256 টি অক্ষরে সীমাবদ্ধ করে) এবং একটি একক ভাষার (বা একই বর্ণমালা সহ ভাষার একটি গ্রুপ) চারপাশে ডিজাইন করা হয়েছে। এটি বহুভাষিক ডেটা সংরক্ষণ করা কঠিন করে তোলে। উদাহরণস্বরূপ, আপনি রাশিয়ান এবং হিব্রু উভয় ডেটা সংরক্ষণ করতে পারবেন না কারণ রাশিয়ান কোড পৃষ্ঠা 1251 ব্যবহার করে এবং হিব্রু কোড পৃষ্ঠা 1255 ব্যবহার করে ।

ইউনিকোড এক মিলিয়নেরও বেশি অক্ষরের জন্য একক দৈত্য কোডড অক্ষর সেট ব্যবহার করে এই সমস্যাটি সমাধান করে, যা বিশ্বের প্রতিটি ভাষার প্রতিনিধিত্ব করতে যথেষ্ট। বেশ কয়েকটি ইউনিকোড এনকোডিং স্কিম রয়েছে; মাইক্রোসফট ব্যবহার করতে পছন্দ করে হল UTF-16 , জন্য ঐতিহাসিক কারণে । যেহেতু ইউটিএফ -16 স্ট্রিংগুলি প্রথাগত 8-বিটের পরিবর্তে 16-বিট কোড ইউনিটের ক্রম হিসাবে উপস্থাপন করে, একটি পৃথক অক্ষর প্রকারের প্রয়োজন। এমএসভিসি ++ এ, এটি wchar_t। এবং এমএস এসকিউএল এ, এটি NCHARবা NVARCHARN"জাতীয়" এর অর্থ দাঁড়ায় যা আমার কাছে পিছনে বলে মনে হয় কারণ ইউনিকোড আন্তঃরাষ্ট্রীয়করণ সম্পর্কে , তবে এটি আইএসও পরিভাষা।

অন্যান্য এসকিউএল বাস্তবায়ন আপনাকে কলামে ইউটিএফ -8 পাঠ্য সংরক্ষণ করতে দেয় VARCHAR। ইউটিএফ -8 হ'ল একটি পরিবর্তনশীল দৈর্ঘ্য (অক্ষর অনুসারে 1-4 বাইট) এনকোডিং যা আপনার ডেটা বেশিরভাগ বেসিক ল্যাটিন পরিসরে থাকে (যা এএসসিআইআই হিসাবে অক্ষর হিসাবে একই 1 বাইট হিসাবে উপস্থাপিত হয়) ক্ষেত্রে ক্ষেত্রে উপযুক্ত হয় তবে প্রতিনিধিত্ব করতে পারে যে কোনও ইউনিকোড অক্ষর। সুতরাং, আপনি bwalk2895 দ্বারা উল্লিখিত "দ্বিগুণ স্থান" সমস্যা এড়াতে চাইবেন।

দুর্ভাগ্যক্রমে, এমএস এসকিউএল সার্ভার ইউটিএফ -8 সমর্থন করে নাVARCHAR , সুতরাং পরিবর্তে আপনাকে ইউটিএফ -16 ব্যবহার করতে হবে (এবং এএসসিআইআই পাঠ্যের জন্য স্থান নষ্ট করতে হবে), নন-ইউনিকোড কোড পৃষ্ঠা ব্যবহার করতে হবে (এবং বিদেশী অক্ষরের প্রতিনিধিত্ব করার ক্ষমতা হারাতে হবে), বা ইউটিএফ -8 একটি BINARYকলামে সঞ্চয় করুন (এবং এসকিউএল স্ট্রিং ফাংশনগুলি সঠিকভাবে কাজ করছে না বা আপনার জিইউআই ডিবি ব্যবস্থাপকটিতে হেক্স ডাম্প হিসাবে ডেটাটি দেখার মতো অসুবিধাগুলি মোকাবেলা করুন )।


1
পূর্ববর্তী সংস্করণগুলিতে এসকিউএল সার্ভার ২০১২ সালে, তারা ইউসিএস -২ এনকোডিং ব্যবহার করে, যা কঠোরভাবে 2 বাইট te নতুন সংস্করণগুলিতে, তারা ইউটিএফ -১ using ব্যবহার করছে যা ভ্যারিয়েবল দৈর্ঘ্যের ম্যাপিং প্রতি চরিত্রের জন্য 4 বাইট (ইউটিএফ -8 এর মতো তবে 2 বাইট থেকে শুরু) হয়।
j123b567
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.