কনভার্ট () নিয়ে এই সমস্যার কারণ কী?


12

নিম্নলিখিত দুটি বিবৃতি বিবেচনা করুন:

PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);

উভয় বিবৃতি ফিরে -1; দ্বিতীয় বাইনারি মান প্রথম মানের তুলনায় দশমিক 65,536 উচ্চতর হ'ল এটি কি ভুল নয়?

নিঃশব্দ কাটার কারণে এটি কি হতে পারে না?

যদি আমি নিম্নলিখিত বিবৃতিগুলি চালিত করি:

PRINT CONVERT(NUMERIC(38, 0),   0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0),   0x00010001, 0);

আমি নিম্নলিখিত ত্রুটি সহ উপস্থাপিত করছি:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.

এখানে কী হচ্ছে তা আমি কীভাবে নির্ণয় করতে পারি?

আমি এটি এসকিউএল সার্ভার 2012, v11.0.5058 এ চালাচ্ছি। ফলাফলগুলি এসকিউএল সার্ভার ২০০৮ আর 2 এসপি 2, এসকিউএল সার্ভার 2005 এবং এসকিউএল সার্ভার 2000 এ একই।


4
দশমিক এবং পুরো সংখ্যাগুলি ভেরিবিনিতে খুব আলাদাভাবে এনকোড করা হয়। দশমিকের জন্য আরও স্থান প্রয়োজন। চেষ্টা করুনSELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
অ্যারন বারট্র্যান্ড

4
হারুন স্পট ইন। আপনার মস্তিষ্ক বাইনারি ডেটাটিকে পূর্ণসংখ্যার ডেটাতে সরাসরি সংখ্যায় রূপান্তরিত করছে, তবে এসকিউএল সার্ভার বাইনারি -> পূর্ণসংখ্যা -> সংখ্যাসূচক (x, y) থেকে এই অন্তর্নিহিত রূপান্তরটি করে না। SQL সার্ভার আপনার চিন্তার প্রক্রিয়া অনুসরণ করার জন্য, আপনি ভালো কিছু করতে হবে চাই: PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
টমাস স্ট্রিংগার

5
প্রথম বাইটটি স্কেল (0x01 = 1), দ্বিতীয় বাইট যথার্থতা (0x00 = 0), চূড়ান্ত বাইট মান (0x01 = 1)। তিন এবং চারটি বাইট কীসের জন্য তা নিশ্চিত নয়। সাইনটি সেখানে আছে তবে এর জন্য দুটি বাইটের দরকার নেই। অবশ্যই এই বিটটি উল্টানো কোনও কিছুরই প্রভাবিত হয়েছে বলে মনে হয় না।
মার্টিন স্মিথ

1
ধন্যবাদ, @ মার্টিনস্মিথ - পৃথিবীতে আপনি কীভাবে নির্ধারণ করলেন যে প্রথম দুটি বাইটটি এরকমভাবে ব্যবহৃত হয়? তা কি নথিভুক্ত?
ম্যাক্স ভার্নন

3
@ অ্যারোনবার্ট্র্যান্ড: আপনি কি এই উত্তরটি দিতে চান? আমরা এটিকে "অনুत्तरযুক্ত" তালিকা থেকে চিহ্নিত করতে পারি।
সমস্ত ট্রেডের জোন

উত্তর:


2

দশমিক এবং পুরো সংখ্যাগুলি ভেরিবিনিতে খুব আলাদাভাবে এনকোড করা হয়। দশমিকের জন্য আরও স্থান প্রয়োজন। চেষ্টা করুন:

SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);

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

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