ঠিক আছে, সনাক্তকারীরা সর্বদা ইউনিকোড / হয় NVARCHAR
, তাই প্রযুক্তিগতভাবে আপনি এমন কোনও কিছুই তৈরি করতে পারবেন না যার একটি ইউনিকোড নাম নেই have
আপনার এখানে যে সমস্যা হচ্ছে তা পুরোপুরি অক্ষর (গুলি) ব্যবহারের কারণে শ্রেণিবদ্ধকরণ। নিয়মিত (অর্থাত না ছাড়ানো) শনাক্তকারীদের নিয়মগুলি হ'ল:
- প্রথম অক্ষরটি অবশ্যই:
- ইউনিকোড স্ট্যান্ডার্ড 3.2 দ্বারা সংজ্ঞায়িত একটি চিঠি।
- আন্ডারস্কোর (_), স্বাক্ষরে (@), বা সংখ্যা চিহ্ন (#)
- পরবর্তী চিঠিগুলি হতে পারে:
- ইউনিকোড স্ট্যান্ডার্ড 3.2-এ সংজ্ঞায়িত বর্ণগুলি।
- বেসিক ল্যাটিন বা অন্যান্য জাতীয় স্ক্রিপ্ট থেকে দশমিক সংখ্যা।
- আন্ডারস্কোর (_), স্বাক্ষরে (@), সংখ্যা চিহ্ন (#), বা ডলার চিহ্ন ($)
- এম্বেড করা স্পেস বা বিশেষ অক্ষর অনুমোদিত নয়।
- পরিপূরক চরিত্রগুলি অনুমোদিত নয়।
আমি এই প্রসঙ্গে একমাত্র নিয়মকে সাহসী করেছিলাম। "প্রথম অক্ষর" বিধিগুলি এখানে প্রাসঙ্গিক না হওয়ার কারণটি হ'ল সমস্ত স্থানীয় ভেরিয়েবল এবং পরামিতিগুলির প্রথম অক্ষর সর্বদা "স্বাক্ষরে" থাকে @
।
এবং স্পষ্টরূপে: কী "অক্ষর" হিসাবে বিবেচিত হয় এবং কোনটিকে "দশমিক অঙ্ক" হিসাবে বিবেচনা করা হয় তা ইউনিকোড চরিত্রের ডেটাবেস-এ প্রতিটি বর্ণচিহ্ন নির্ধারিত বৈশিষ্ট্যের উপর নির্ভর করে । ইউনিকোড প্রতিটি চরিত্রের জন্য অনেকগুলি বৈশিষ্ট্য বরাদ্দ করে, যেমন: is_uppercase, is_lowercase, is_digit, is_decimal, is_compining, ইত্যাদি ইত্যাদি we এটি আমরা মর্টেলগুলি অক্ষর বা দশমিক অঙ্ক বিবেচনা করব তা নয়, তবে কোন বৈশিষ্ট্যগুলিকে এই বৈশিষ্ট্যগুলি অর্পণ করা হয়েছে। এই বিভাজনগুলি প্রায়শই "বিরামচিহ্ন" ইত্যাদির সাথে মেলে নিয়মিত এক্সপ্রেশনগুলিতে ব্যবহৃত হয় উদাহরণস্বরূপ, \p{Lu}
কোনও উচ্চ-অক্ষরের সাথে (সমস্ত ভাষা / স্ক্রিপ্ট জুড়ে) \p{IsDingbats}
মেলে এবং কোনও "ডিঙ্গব্যাটস" চরিত্রের সাথে মেলে।
সুতরাং, আপনার প্রয়াসে:
DECLARE @¯\_(ツ)_/¯ INT;
কেবলমাত্র _
(আন্ডারস্কোর বা "নিম্ন রেখা") এবং ツ
(কাতাকানা লেটার টু ইউ + 30 সি 4) অক্ষরগুলি এই নিয়মগুলির মধ্যে খাপ খায়। এখন, সমস্ত চরিত্রগুলি ¯\_(ツ)_/¯
সীমিত চিহ্নিতকারীদের জন্য ঠিক আছে, তবে দুর্ভাগ্যক্রমে মনে হচ্ছে ভেরিয়েবল / প্যারামিটারের নাম এবং GOTO
লেবেলগুলি সীমিত করা যায় না (যদিও কার্সারের নামগুলি হতে পারে)।
সুতরাং, ভেরিয়েবল / প্যারামিটার নামের জন্য, যেহেতু সেগুলি সীমিত করা যায় না, আপনি কেবল অক্ষর ব্যবহার করে আটকে গেছেন যা ইউনিকোড ৩.২ অনুযায়ী "অক্ষর" বা "দশমিক সংখ্যা" হিসাবে উপযুক্ত (ডকুমেন্টেশন অনুসারে; আমার পরীক্ষা করা দরকার) শ্রেণিবিন্যাস যদি ইউনিকোডের নতুন সংস্করণগুলির জন্য আপডেট করা থাকে যেহেতু শ্রেণিবদ্ধকরণগুলি সাজানো ওজনের চেয়ে আলাদাভাবে পরিচালনা করা হয়)।
তবুও # 1 , জিনিসগুলি যেমন হওয়া উচিত তত সোজা-এগিয়ে নেই। আমি এখন আমার গবেষণা সম্পূর্ণ করতে সক্ষম হয়েছি এবং বলেছি যে বর্ণিত সংজ্ঞাটি পুরোপুরি সঠিক নয়। নিয়মিত শনাক্তকারীদের জন্য কোন অক্ষরগুলি বৈধ তা সঠিক (এবং যাচাইযোগ্য) সংজ্ঞাটি হ'ল:
প্রথম চরিত্র:
- ইউনিকোড ৩.২ এ "আইডি_সার্ট" হিসাবে শ্রেণিবদ্ধ করা যায় এমন কিছু (যা "চিঠিগুলি" অন্তর্ভুক্ত করে তবে "অক্ষরের মতো সংখ্যার অক্ষর "ও অন্তর্ভুক্ত)
_
(নিম্নরেখা / আন্ডারস্কোর) বা _
(পূর্ণ প্রশস্ততম নিম্নরেখা) হতে পারে
- হতে পারে
@
তবে কেবল পরিবর্তনশীল / পরামিতিগুলির জন্য
- হতে পারে
#
, তবে যদি স্কিমা-সীমাবদ্ধ অবজেক্ট থাকে তবে কেবল টেবিল এবং সঞ্চিত প্রক্রিয়াগুলির জন্য (যে ক্ষেত্রে তারা নির্দেশ করে যে বস্তুটি অস্থায়ী)
পরবর্তী চরিত্রগুলি:
- ইউনিকোড ৩.২ এ "আইডি_কন্টিনিউ" হিসাবে শ্রেণিবদ্ধ কিছু হতে পারে (যার মধ্যে "দশমিক" সংখ্যা রয়েছে, তবে "ব্যবধান এবং সংযোগের চিহ্নগুলি সংযুক্ত করে", এবং "বিরাম চিহ্নগুলি সংযুক্ত করে")
- হতে পারে
@
, #
অথবা$
- ফর্ম্যাট নিয়ন্ত্রণের অক্ষর হিসাবে ইউনিকোড 3.2 এ শ্রেণিবদ্ধত 26 টি বর্ণের মধ্যে যে কোনও একটি হতে পারে
(মজাদার ঘটনা: "আইডি_এসটিআর্ট" এবং "আইডি_কন্টিনিউ" "আইডি" মানে "আইডেন্টিফায়ার" Ima ধারণা করুন ;-)
"ইউনিকোড ইউটিলিটিস: ইউনিকোডসেট" অনুসারে:
বৈধ শুরুর অক্ষর
[: বয়স = ৩.২:] এবং [: আইডি_স্টার্ট = হ্যাঁ:]
-- Test one "Letter" from each of 10+ languages, as of Unicode 3.2
DECLARE @ᔠᑥᑒᏯשፙᇏᆇᄳᄈლဪඤaൌgೋӁウﺲﶨ INT;
-- works
-- Test a Supplementary Character that is a "Letter" as of Unicode 3.2
DECLARE @𝒲 INT;-- Mathematical Script Capital W (U+1D4B2)
/*
Msg 102, Level 15, State 1, Line XXXXX
Incorrect syntax near '0xd835'.
*/
বৈধ ধারাবাহিকতা অক্ষর
[: বয়স = ৩.২:] এবং [[আইডি_কন্টিনিয় = হ্যাঁ:]
-- Test various decimal numbers, but none are Supplementary Characters
DECLARE @६৮༦൯௫୫9 INT;
-- works (including some Hebrew and Arabic, which are right-to-left languages)
-- Test a Supplementary Character that is a "decimal" number as of Unicode 3.2
DECLARE @𝟜 INT; -- MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR (U+1D7DC)
/*
Msg 102, Level 15, State 1, Line XXXXX
Incorrect syntax near '0xd835'.
*/
-- D835 is the first character in the surrogate pair D835 DFDC that makes up U+1D7DC
যাইহোক, # 2 , এমনকি ইউনিকোড ডাটাবেস অনুসন্ধান করাও এত সহজ হতে পারে। এই দুটি অনুসন্ধানগুলি এই শ্রেণিবদ্ধকরণগুলির জন্য বৈধ অক্ষরের একটি তালিকা তৈরি করে এবং সেই অক্ষরগুলি ইউনিকোড ৩.২ থেকে এসেছে, তবে ইউনিকোড স্ট্যান্ডার্ডের সংস্করণগুলিতে বিভিন্ন শ্রেণিবদ্ধকরণগুলির পরিবর্তনের সংজ্ঞা রয়েছে। অর্থ, ইউনিকোড বনাম 10.0 মধ্যে "ID_Start" এর ডেফিনেশনে (কি করে যা অনুসন্ধান আজ ব্যবহার করছে, 2018-03-26) হল না কি এটা ইউনিকোড বনাম 3.2 ছিল। সুতরাং, অনলাইন অনুসন্ধান সঠিক তালিকা সরবরাহ করতে পারে না। তবে আপনি ইউনিকোড ৩.২ তথ্য ফাইল দখল করতে পারেন এবং এসকিউএল সার্ভারটি আসলে কী ব্যবহার করে তার সাথে তুলনা করতে সেখান থেকে "আইডি_সার্ট" এবং "আইডি_সন্টিন্য" অক্ষরগুলির তালিকাটি দখল করতে পারেন। এবং আমি এটি করেছি এবং "হ্যাভার # 1" এ উল্লিখিত বিধিগুলির সাথে একটি সঠিক মিলের বিষয়টি নিশ্চিত করেছি।
নিম্নলিখিত দুটি ব্লগ পোস্ট আমদানি স্ক্রিপ্টগুলির লিঙ্কগুলি সহ অক্ষরের সঠিক তালিকা খুঁজে পেতে নেওয়া পদক্ষেপগুলি বিস্তারিত জানায়:
- ইউনি-কোড: টি-এসকিউএল নিয়মিত শনাক্তকারীদের জন্য বৈধ অক্ষরের সঠিক তালিকার সন্ধান, পর্ব 1
- ইউনি-কোড: টি-এসকিউএল নিয়মিত শনাক্তকারীর জন্য বৈধ অক্ষরের সঠিক তালিকার সন্ধান, পার্ট 2
অবশেষে, যে কেউ কেবল তালিকাটি দেখতে চান এবং এটি আবিষ্কার এবং যাচাই করতে এটি কী নিয়েছে তা নিয়ে উদ্বিগ্ন নয়, আপনি এটি এখানে খুঁজে পেতে পারেন:
বৈধ টি-এসকিউএল সনাক্তকারী অক্ষরের সম্পূর্ণরূপে সম্পূর্ণ তালিকা
(পৃষ্ঠাটি লোড করার জন্য একটি মুহূর্ত দিন; এটি 3.5 এমবি এবং প্রায় 47k লাইন)
"বৈধ" এএসসিআইআই অক্ষর, যেমন /
এবং -
কাজ না করা সম্পর্কিত: এএসসিআইআই চরিত্রের সেটগুলিতে অক্ষরগুলিও সংজ্ঞায়িত করা হয় বা হয় না এর সাথে ইস্যুটির কোনও সম্পর্ক নেই। বৈধ হওয়ার জন্য, চরিত্রটির হয় ID_Start
বা ID_Continue
সম্পত্তি থাকতে হবে, বা আলাদাভাবে উল্লেখ করা কয়েকটি কাস্টম চরিত্রগুলির মধ্যে একটি হতে হবে। বেশ কয়েকটি "বৈধ" এএসসিআইআই অক্ষর রয়েছে (মোট 128 টির মধ্যে 62 - বেশিরভাগ বিরামচিহ্ন এবং নিয়ন্ত্রণের অক্ষর) যা "নিয়মিত" সনাক্তকারীগুলিতে বৈধ নয়।
পরিপূরক চরিত্রগুলি সম্পর্কে: যদিও তারা অবশ্যই সীমিত চিহ্নিতকারীগুলিতে ব্যবহার করা যেতে পারে (এবং ডকুমেন্টেশন অন্যথায় উল্লেখ করে বলে মনে হচ্ছে না), যদি সত্য হয় যে সেগুলি নিয়মিত শনাক্তকারীগুলিতে ব্যবহার করা যায় না, সম্ভবত তাদের পুরোপুরি সমর্থিত না হওয়ায় সম্ভবত এসকিউএল সার্ভার ২০১২-এ পরিপূরক চরিত্র-সচেতন কলশনগুলির পূর্বে অন্তর্নির্মিত কার্যগুলিতে প্রবর্তন করা হয়েছিল (এগুলিকে দুটি স্বতন্ত্র "অজানা" চরিত্র হিসাবে বিবেচনা করা হয়), এমনকি 100- এর পূর্বে নন-বাইনারি কোলেশনে তারা একে অপরের থেকে পৃথকও হতে পারে could স্তর স্তরের (এসকিউএল সার্ভার ২০০৮ সালে প্রবর্তিত)।
এএসসিআইআই সম্পর্কিত: 8-বিট এনকোডিংগুলি এখানে ব্যবহার করা হচ্ছে না কারণ সমস্ত সনাক্তকারী ইউনিকোড / NVARCHAR
/ ইউটিএফ -16 এলই। বিবৃতিটি একটি "যা" এর SELECT ASCII('ツ');
মান দেয় 63
? (চেষ্টা করুন SELECT CHAR(63);
) যেহেতু character অক্ষরটি এমনকি যদি উচ্চতর কেস "এন" এর সাথে উপস্থাপিত হয় তবে অবশ্যই কোড পৃষ্ঠা 1252 তে নেই However তবে, সেই অক্ষরটি কোরিয়ান কোড পৃষ্ঠাতে রয়েছে এবং এটি "এন ছাড়াই সঠিক ফলাফল প্রদান করে" "উপসর্গ, একটি কোরিয়ান ডিফল্ট কোলেশন সহ একটি ডাটাবেসে:
SELECT UNICODE('ツ'); -- 12484
ফলাফলকে প্রভাবিত করে প্রথম চিঠিটি সম্পর্কে: স্থানীয় ভেরিয়েবল এবং পরামিতিগুলির জন্য প্রথম অক্ষর সর্বদা থাকায় এটি সম্ভব নয় @
। এই নামগুলির জন্য আমরা যে প্রথম অক্ষরটি নিয়ন্ত্রণ করতে পারি তা আসলে নামের ২ য় অক্ষর।
স্থানীয় ভেরিয়েবলের নাম, প্যারামিটারের নাম এবং GOTO
লেবেলগুলি কেন সীমিত করা যায় না তা সম্পর্কে: আমি সন্দেহ করি যে এটি এই আইটেমগুলি নিজেরাই ভাষার একটি অংশ হয়ে গেছে এবং এটি এমন কোনও কিছু নয় যা ডেটা হিসাবে সিস্টেম টেবিলে প্রবেশ করবে।