নির্বাচিত ক্ষেত্রে এখনও অতিরিক্ত চরিত্রের সাথে মেলে অনন্য পরিচয়কারী


19

আমরা একটি অনন্য শনাক্তকারী সহ এসকিউএল সার্ভার ২০১২ ব্যবহার করছি এবং আমরা লক্ষ্য করেছি যে অতিরিক্ত অক্ষর যুক্ত করে বাছাই করার সময় শেষ পর্যন্ত যুক্ত করা হয় (সুতরাং ৩rs টি অক্ষর নয়) এটি এখনও কোনও ইউইউডি-তে ম্যাচ ফেরায়।

উদাহরণ স্বরূপ:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

uuid দিয়ে সারিটি ফেরত দেয় 7DA26ECB-D599-4469-91D4-F9136EC0B4E8

তবে আপনি যদি চালান:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

এটি ইউয়েডের সাথে সারিটি ফেরত দেয় 7DA26ECB-D599-4469-91D4-F9136EC0B4E8

এসকিউএল সার্ভারটি নির্বাচনগুলি করার সময় 36 টিরও বেশি সমস্ত অক্ষর উপেক্ষা করবে বলে মনে হচ্ছে। এটি কি কোনও বাগ / বৈশিষ্ট্য বা এমন কিছু যা কনফিগার করা যায়?

এটি দৈর্ঘ্যের জন্য সম্মুখ প্রান্তে আমাদের বৈধতা রয়েছে বলে কোনও বিশাল সমস্যা নয় তবে এটি আমার কাছে সঠিক আচরণ বলে মনে হয় না।

উত্তর:


10

মান কোঁকড়া বন্ধনীতে আবদ্ধ থাকলে অন্তর্নিহিত রূপান্তরটিও কাজ করে {...}

যদি আপনি ক্যোয়ারীতে এগুলি যুক্ত করেন তবে মূল মানটি খুব দীর্ঘ হলে অন্তর্নিহিত রূপান্তরটি ব্যর্থ হবে কারণ শেষ }জায়গায় ভুল জায়গায় শেষ হয়।

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

আপনি যদি রূপান্তর চেষ্টা করেন

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

তুমি পাও

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

এসকিউএল সার্ভারটি নির্বাচনগুলি করার সময় 36 টিরও বেশি সমস্ত অক্ষর উপেক্ষা করবে বলে মনে হচ্ছে। এটি কি কোনও বাগ / বৈশিষ্ট্য বা এমন কিছু যা কনফিগার করা যায়?

প্রকারের জন্য বই অনলাইন এন্ট্রিটিতেuniqueidentifier আচরণটি নথিভুক্ত করা হয় :

বিএল এন্ট্রি এক্সট্রাক্ট

উদাহরণ হিসাবে উল্লেখ করা হয়:

বিওএল উদাহরণ

বলা হচ্ছে, আমি অন্তর্নিহিত রূপান্তরগুলি এড়াতে পছন্দ করি। একটি uniqueidentifierআক্ষরিক টিডি এসকিউএলে সরাসরি ওডিবিসি এস্কেপ সিনট্যাক্স ব্যবহার করে টাইপ করা যেতে পারে:

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

এটি একই সিনট্যাক্স এসকিউএল সার্ভার কার্যকরভাবে প্রয়োগের পরিকল্পনাগুলিতে অভ্যন্তরীণভাবে ব্যবহার করে যখন কোনও টাইপে স্ট্রিং প্রতিনিধিত্বকে ধ্রুবকভাবে ভাঁজ করে uniqueidentifier:

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

সূচিটি ইউইডির সন্ধান করুন

আপনি uniqueidentifiersএসকিউএল সার্ভারে টাইপ করা এবং পাস করতে পারবেন কিনা আপনি যে লাইব্রেরিটি ব্যবহার করছেন তার উপর নির্ভর করতে পারে তবে 36-অক্ষরের স্ট্রিংগুলি উপলভ্য বিকল্পগুলির মধ্যে সর্বনিম্ন পছন্দসই হিসাবে আমাকে আঘাত করে। যদি আপনাকে অবশ্যই রূপান্তর সম্পাদন করতে হয় তবে সেগুলি স্পষ্ট করে তুলুন এবং স্ট্রিংয়ের পরিবর্তে 16 বাইটের বাইনারি মান ব্যবহার করুন।


9

অন্তর্নিহিত রূপান্তরকালে অতিরিক্ত অক্ষরগুলি এসকিউএল সার্ভার দ্বারা কেবল উপেক্ষা করা হবে (ভালভাবে, নিঃশব্দে কাটা)। উদাহরণ স্বরূপ:

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

ফলাফল:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

এটি এই দৃশ্যের বিপরীতে নয়:

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

ফলাফল:

----
x  

আপনি এটি কনফিগার করতে পারবেন না তবে আপনি যদি নিজের ভেরিয়েবল রূপান্তরকে ব্যর্থ করতে চান তবে আপনি ভেরিয়েবলটি CHAR(36)প্রথমে একটি টেবিলের মধ্যে ভরাট করতে চেষ্টা করতে পারেন , যা কেটে যাওয়ার কারণে ব্যর্থ হবে:

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

ফলাফল:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.