অ-অঙ্কগুলি কেন পছন্দ হয় [0-9]?


13

আমার সার্ভারের ডিফল্ট কোলেশনটি ল্যাটিন 1_ জেনারাল_সিআই_এএস, এই কোয়েরির দ্বারা নির্ধারিত:

SELECT SERVERPROPERTY('Collation') AS Collation;

আমি অবাক হয়ে আবিষ্কার করেছিলাম যে এই জোটের সাহায্যে আমি প্রিপিকেটটি ব্যবহার করে স্ট্রিংগুলিতে অ-অঙ্কের অক্ষরের সাথে মেলে ধরতে পারি LIKE '[0-9]'

ডিফল্ট জোটে কেন এটি ঘটে? আমি এমন কোনও ক্ষেত্রে ভাবতে পারি না যেখানে এটি কার্যকর হবে। আমি জানি আমি বাইনারি কোলেশন ব্যবহার করে আচরণটি ঘিরে কাজ করতে পারি তবে এটি ডিফল্ট কোলিশনটি বাস্তবায়নের এক অদ্ভুত উপায় বলে মনে হয়।

ফিল্টারিং অঙ্কগুলি অ-অঙ্কের ক্যারাকটর তৈরি করে

আমি এমন একটি কলাম তৈরি করে আচরণটি প্রদর্শন করতে পারি যাতে সমস্ত সম্ভাব্য একক-বাইট চরিত্রের মান থাকে এবং ডিজিট-ম্যাচিং প্রিকিকেট দিয়ে মানগুলি ফিল্টার করে।

নিম্নলিখিত বিবৃতিটি 256 সারি সহ একটি অস্থায়ী সারণী তৈরি করে, বর্তমান কোড পৃষ্ঠাতে প্রতিটি কোড পয়েন্টের জন্য একটি:

WITH P0(_) AS (SELECT 0 UNION ALL SELECT 0),
P1(_) AS (SELECT 0 FROM P0 AS L CROSS JOIN P0 AS R),
P2(_) AS (SELECT 0 FROM P1 AS L CROSS JOIN P1 AS R),
P3(_) AS (SELECT 0 FROM P2 AS L CROSS JOIN P2 AS R),
Tally(Number) AS (
  SELECT -1 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))
  FROM P3
)
SELECT Number AS CodePoint, CHAR(Number) AS Symbol
INTO #CodePage
FROM Tally
WHERE Number >= 0 AND Number <= 255;

প্রতিটি সারিতে কোড পয়েন্টের পূর্ণসংখ্যার মান এবং কোড পয়েন্টের চরিত্রের মান থাকে। সমস্ত অক্ষরের মান প্রদর্শনযোগ্য নয় - কিছু কোড পয়েন্ট কঠোরভাবে অক্ষর নিয়ন্ত্রণ করে। এখানে আউটপুট একটি নির্বাচনী নমুনা SELECT CodePoint, Symbol FROM #CodePage:

0   
1   
2   
...
32   
33  !
34  "
35  #
...
48  0
49  1
50  2
...
65  A
66  B
67  C
...
253 ý
254 þ
255 ÿ

আমি প্রতীক কলামে ফিল্টার করতে পারব বলে আশা করি একটি লাইক প্রিডিকেট ব্যবহার করে এবং '0' এর মাধ্যমে '9' এর মধ্যে বর্ণগুলির পরিসর নির্দিষ্ট করে:

SELECT CodePoint, Symbol
FROM #CodePage
WHERE Symbol LIKE '[0-9]';

এটি একটি আশ্চর্যজনক আউটপুট উত্পাদন করে:

CodePoint   Symbol
48  0
49  1
50  2
51  3
52  4
53  5
54  6
55  7
56  8
57  9
178 ²
179 ³
185 ¹
188 ¼
189 ½
190 ¾

48 এর মধ্য দিয়ে কোড পয়েন্টগুলির সেটটি আমার প্রত্যাশা। আমার অবাক করে দেওয়ার বিষয় হ'ল সুপারস্রিপ্ট এবং ভগ্নাংশের প্রতীকগুলিও ফলাফলের সেটটিতে অন্তর্ভুক্ত রয়েছে!

প্রকাশক এবং ভগ্নাংশকে সংখ্যা হিসাবে ভাবার কোনও গাণিতিক কারণ থাকতে পারে, তবে তাদেরকে অঙ্ক বলা ভুল বলে মনে হচ্ছে।

বাইনারি কোলেশনকে কাজের লক্ষণ হিসাবে ব্যবহার করা হচ্ছে

আমি বুঝতে পেরেছি যে ফলাফলটি আমি প্রত্যাশা করি তা পেতে, আমি সংশ্লিষ্ট বাইনারি কোলেশনটি জোর করে জারি করতে পারি লাতিন 1_ জেনারাল_বিএন:

SELECT CodePoint, Symbol
FROM #CodePage
WHERE Symbol LIKE '[0-9]' COLLATE Latin1_General_BIN;

ফলাফলের সেটটিতে 57 থেকে 57 এর মধ্যে কেবল কোড পয়েন্ট রয়েছে:

CodePoint   Symbol
48  0
49  1
50  2
51  3
52  4
53  5
54  6
55  7
56  8
57  9

উত্তর:


22

[0-9] কেবল অঙ্কের সাথে মেলে এমন কোনও ধরণের নিয়মিত অভিব্যক্তি সংজ্ঞায়িত হয় না।

কোনও LIKEপ্যাটার্নের যে কোনও ব্যাপ্তি কোলেশন সাজানোর ক্রম অনুসারে শুরু এবং শেষ অক্ষরের মধ্যে অক্ষরের সাথে মেলে।

SELECT CodePoint,
       Symbol,
       RANK() OVER (ORDER BY Symbol COLLATE Latin1_General_CI_AS) AS Rnk
FROM   #CodePage
WHERE  Symbol LIKE '[0-9]' COLLATE Latin1_General_CI_AS
ORDER  BY Symbol COLLATE Latin1_General_CI_AS 

রিটার্নস

CodePoint            Symbol Rnk
-------------------- ------ --------------------
48                   0      1
188                  ¼      2
189                  ½      3
190                  ¾      4
185                  ¹      5
49                   1      5
50                   2      7
178                  ²      7
179                  ³      9
51                   3      9
52                   4      11
53                   5      12
54                   6      13
55                   7      14
56                   8      15
57                   9      16

সুতরাং আপনি এই ফলাফলগুলি পান কারণ আপনার ডিফল্ট জোটের অধীনে এই অক্ষরগুলি পরে 0কিন্তু আগে সাজানো হয় 9

দেখে মনে হচ্ছে যেন কোলেশন মধ্যে সঠিক অনুক্রমে ভগ্নাংশ সঙ্গে গাণিতিক অনুক্রমে আসলে সাজানোর তাদের সংজ্ঞায়িত করা হয় 0এবং 1

আপনি একটি ব্যাপ্তির চেয়ে একটি সেটও ব্যবহার করতে পারেন। 2মিলে যাওয়া এড়াতে ²আপনার একটি CSকোলেশন প্রয়োজন would

SELECT CodePoint, Symbol
FROM #CodePage
WHERE Symbol LIKE '[0123456789]' COLLATE Latin1_General_CS_AS

6

Latin1 কোড পৃষ্ঠা 1252, যা হয় 178 'সুপারস্ক্রিপ্ট দুটি' হয় । এটি একটি ইউনিকোড সুপারস্ক্রিপ্ট : সুপারস্ক্রিপ্ট হিসাবে "2" চরিত্র । মতে ইউনিকোড প্রযুক্তিগত মান # 10 এটি 2 সমান তুলনা করা উচিত, দেখতে 8.1 কোলেশন ভাঁজ :

প্রতিনিধি চরিত্র (গুলি) এর সাথে মানচিত্রের সামঞ্জস্যতা (তৃতীয়) সমতুল্য, যেমন পুরো-প্রস্থ এবং সুপারস্ক্রিপ্ট অক্ষরগুলি

বাগটি যদি সুপারস্ক্রিপ্ট 2 এর সাথে 2 এর চেয়ে আলাদা হয়! আপনি বলার আগে 'তবে আমার কলামটি ইউনিকোড নয়', বিশ্রামের আশ্বাস দিন: এমএসডিএন অনুসারে (উইন্ডোজ কোলিশেশনগুলি দেখুন) সমস্ত স্ট্রিং তুলনা এবং বাছাই ইউনিকোড নিয়ম অনুসারে করা হয়, এমনকি ডিস্কের উপস্থাপনাটি CHAR হওয়া সত্ত্বেও।

আপনার উদাহরণের অন্যান্য চরিত্রগুলির মতো, VULGAR FRACTION ONE QUARTERএবং পছন্দ মতো তারা কোনও সংখ্যার সাথে সমান তুলনা করে না, তবে মার্ক ইতিমধ্যে দেখিয়েছে যে তারা 0 এবং 9 এর মধ্যে সঠিকভাবে সাজান।

এবং অবশ্যই, আপনি কোড পৃষ্ঠাটি পরিবর্তন করতে চাইলে আপনি বিভিন্ন ফলাফল পাবেন। যেমন। সঙ্গে Greek_CS_AS( কোড পৃষ্ঠা 1253 ) আপনি কোড 178, 179 এবং 189 দিয়ে অক্ষর পেতে হবে।

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