কিছু বিশেষ চরিত্রের জন্য ISNUMERIC এর পিছনে যুক্তি কী?


14

ISNUMERICফাংশন কিছু অপ্রত্যাশিত আচরণ হয়েছে। এমএসডিএন ডকুমেন্টেশন বলে:

ISNUMERIC1 প্রদান করে যখন ইনপুট এক্সপ্রেশনটি একটি বৈধ সংখ্যাযুক্ত ডেটা টাইপের মূল্যায়ন করে; অন্যথায় এটি 0 ফেরত দেয়। বৈধ সংখ্যাযুক্ত ডেটা টাইপগুলির মধ্যে নিম্নলিখিতগুলির অন্তর্ভুক্ত থাকে: ইনট, বিগিন্ট, স্মলিন্ট, টিনিনেন্ট, দশমিক, সংখ্যাসূচক, অর্থ, ছোটমণি, ভাসমান, আসল

এবং এটির একটি পাদটীকাও রয়েছে:

ISNUMERICকিছু অক্ষরের জন্য 1 প্রদান করে যা সংখ্যা নয়, যেমন প্লাস (+), বিয়োগ (-) এবং বৈধ মুদ্রার চিহ্ন যেমন ডলারের চিহ্ন ($)। মুদ্রা প্রতীকগুলির একটি সম্পূর্ণ তালিকার জন্য, অর্থ এবং স্মার্টমনি (লেনদেন-এসকিউএল) দেখুন

ঠিক আছে, সুতরাং +, -এবং তালিকাভুক্ত মুদ্রার প্রতীকগুলি সংখ্যা হিসাবে বিবেচিত হবে বলে আশা করা হচ্ছে। এ পর্যন্ত সব ঠিকই.

বিজোড় অংশ জন্য। প্রথমত, লিঙ্কযুক্ত নিবন্ধ থেকে কিছু মুদ্রার প্রতীক সংখ্যাযুক্ত নয় , সহ:

  • ইউরো-কারেন্সি সাইন, হেক্স 20 এ 0:
  • নাইরা সাইন, হেক্স 20 এ 6:
  • রিয়াল সাইন, হেক্স এফডিএফসি:

এটি অদ্ভুত, এবং কেন আমি তা খুঁজে বের করতে পারি না? এই সংস্করণ বা পরিবেশ নির্ভর?

যাইহোক, জিনিসগুলি অস্থির হয়ে ওঠে। আমি এখানে ব্যাখ্যা করতে পারি না এমন আরও কয়েক জন এখানে রয়েছে:

  • /সংখ্যাসূচক নয়, তবে \এটি ( হু ?! )
  • REPLICATE(N'9', 308)সংখ্যাগত, কিন্তু REPLICATE(N'9', 309)হয় না

প্রথম এবং সর্বাধিক প্রাথমিক প্রশ্ন: উপরোক্ত মামলাগুলি কী ব্যাখ্যা করে? আরও গুরুত্বপূর্ণ যদিও: পিছনে যুক্তিটি কীISNUMERIC , তাই আমি নিজেই সমস্ত ঘটনা ব্যাখ্যা / পূর্বাভাস দিতে পারি?

জিনিসগুলি পুনরুত্পাদন করার জন্য এখানে একটি ভাল উপায়:

DECLARE @tbl TABLE(txt NVARCHAR(1000));

INSERT INTO @tbl (txt) 
VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'), 
       (NCHAR(8356)), (NCHAR(8352)), (NCHAR(8358)), (NCHAR(65020)), 
       (N'+'), (N'-'), (N'/'), (N'\'), (N'_'), (N'e'), (N'1e'), (N'e1'), (N'1e1'), 
       (N'1'), (N'-1'), (N'+1'), (N'1+1'), (N''), (N'🄂'), (N'¹'), (N''), (N'½'), 
       (N'🎅'), (REPLICATE(N'9', 307)), (REPLICATE(N'9', 308)), (REPLICATE(N'9', 309)), 
       (REPLICATE(N'9', 310));

SELECT  UNICODE(LEFT(txt, 1)) AS FirstCharAsInt,
        LEN(txt) AS TxtLength,
        txt AS Txt,
        ISNUMERIC(txt) AS [ISNUMERIC]
FROM    @tbl;

আমি যখন আমার স্থানীয় এসকিএল সার্ভার 2012 বাক্সে এটি চালিত করি তখন আমি নিম্নলিখিত ফলাফলগুলি পাই:

FirstCharAsInt   TxtLength   Txt        ISNUMERIC
---------------  ----------  ---------  ----------
NULL             0                      0
32               0                      0
8364             1           €          1
36               1           $          1
36               2           $$         0
8356             1           ₤          1
8352             1           ₠          0  --??
8358             1           ₦          0  --??
65020            1           ﷼‎          0  --??
43               1           +          1
45               1           -          1
47               1           /          0
92               1           \          1  --??
95               1           _          0
101              1           e          0
49               2           1e         0
101              2           e1         0
49               3           1e1        1
49               1           1          1
45               2           -1         1
43               2           +1         1
49               3           1+1        0
9352             1           ⒈         0
55356            2           🄂          0
185              1           ¹          0
9312             1           ①          0
189              1           ½          0
55356            2           🎅         0
57               307        /*...*/     1
57               308        /*...*/     1  --??
57               309        /*...*/     0  --??
57               310        /*...*/     0

আমার কাছে কেবলমাত্র ভুল বলে মনে হচ্ছে তা হ'ল এটি মিথ্যাভাবে 0পাঁচটি মানের জন্য রিপোর্ট করে যা আসলে জরিমানা করে money। অন্যদের সঠিক মনে হয়। এসকিউএল ফিডল
মার্টিন স্মিথ

যদিও NCHAR(0) - NCHAR(65535)আমি 112 এর ত্রুটি দেখতে পাচ্ছি। অক্ষরগুলি অন্তর্ভুক্ত করা হয় যেমন ₁,₂,₃,4,5,6,7,8,9সংখ্যাসূচক দেখায় তবে আমার জন্য সফলভাবে কোনও কিছুতে কাস্ট করেন না। ফিডল
মার্টিন স্মিথ

উত্তর:


13

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

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


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

1
@ অ্যারনবার্ট্রান্ড এমন একটি উল্লেখযোগ্য সংখ্যক মামলা রয়েছে যেখানে এটি এমনকি সেই উদ্দেশ্যটিও পূরণ করে না।
মার্টিন স্মিথ

9

এএসসিআইআই ব্যাকস্ল্যাশ (কোড পয়েন্ট 5 সি) উইন্ডোজ এর জাপানি সংস্করণ দ্বারা ব্যবহৃত শিফট-জেআইএস এনকোডিংয়ে ইয়েন সাইন (¥) এবং কোরিয়ান ইইউসি-কেআর তে উইন সাইন (₩) হিসাবে একই কোড পয়েন্ট ভাগ করে নেওয়ার জন্য ঘটে। সুতরাং, এটি সম্ভবত মুদ্রা সাইন থিমের একটি ধারাবাহিকতা।


আহ এটি একটি আকর্ষণীয় তত্ত্ব। এটি moneyএটিও কাস্ট করে।
মার্টিন স্মিথ


3
@ জিরোইন আমি ভয় করি না। আপনার উইন্ডোজ ইনস্টলেশনটির লিগ্যাসি কোড পৃষ্ঠাটি C:¥Program Files¥
জাপানিগুলিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.