128 বিট পূর্ণসংখ্যার জন্য মাইএসকিউএল ডেটা টাইপ করুন


12

আমার মাইএসকিউএলে 128 বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যা সংরক্ষণ করতে হবে এবং আমি ভাবছিলাম যে এত বড় সংখ্যার সঞ্চয় করার জন্য সেরা ডেটা টাইপ কোনটি।

এখনই, আমি ব্যবহার করছি binary(16)তবে এতে প্রচুর রূপান্তর ফাংশন জড়িত pack(/huge number in hex .../)

128 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার সঞ্চয় করার জন্য কি কোনও সেরা ডেটাটাইপ রয়েছে?


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

আমি যখন 8 টি এবং 16 বিট সিস্টেমের সাথে কাজ করছিলাম তখন ফরটারান এবং অন্যান্য ভাষাগুলি কীভাবে 64 বিট পূর্ণসংখ্যাকে সমর্থন করেছিল তা দেখার জন্য আমি আগ্রহী হব।
জো

@ রাসেল স্টেইন, আরও শক্তিশালী ডিবি প্ল্যাটফর্ম হিসাবে আপনি কী কী ক্ষতিপূরণ চান?
কামি

আপনার এখনও এটি প্যাক এবং আনপ্যাক করা দরকার তবে পোস্টগ্রিসের দেশীয় 128-বিট টাইপ রয়েছে
গাইস

উত্তর:


10

এটি সংরক্ষণ করার জন্য অগত্যা সর্বোত্তম উপায়টি কী তা আমি জানি না - তবে একটি ব্যবহার করার চেয়ে কমপক্ষে আরও ভাল বিকল্প রয়েছে varchar(39)(বা varchar(40)যদি এটির স্বাক্ষর করার প্রয়োজন হয়); পরিবর্তে একটি ব্যবহার decimal(39,0)মাইএসকিএল ডক্স থেকে :

নির্দিষ্ট পয়েন্ট (সঠিক মান) প্রকার

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

মাইএসকিউএল 5.1 বাইনারি ফর্ম্যাটে ডেসিমাল মানগুলি সঞ্চয় করে। মাইএসকিউএল 5.0.3 এর আগে সেগুলি স্ট্রিং হিসাবে সংরক্ষণ করা হয়েছিল। বিভাগ 11.18, "যথার্থ গণিত" দেখুন।

একটি ডেসিমাল কলাম ঘোষণায়, নির্ভুলতা এবং স্কেল নির্দিষ্ট করা যেতে পারে (এবং সাধারণত ব্যবহৃত হয়); উদাহরণ স্বরূপ:

salary DECIMAL(5,2)

এই উদাহরণে, 5 হ'ল যথার্থতা এবং 2 স্কেল। যথাযথতা উল্লেখযোগ্য অঙ্কগুলির সংখ্যা উপস্থাপন করে যা মানগুলির জন্য সঞ্চিত থাকে এবং স্কেল দশমিক সংখ্যাটি অনুসরণ করে সংরক্ষণ করা যায় এমন সংখ্যাগুলির প্রতিনিধিত্ব করে।

স্ট্যান্ডার্ড এসকিউএল প্রয়োজন যে ডিসিমাল (5,2) পাঁচটি অঙ্ক এবং দুটি দশমিক সহ যে কোনও মান সংরক্ষণ করতে সক্ষম হবে, সুতরাং যে মানগুলি বেতন কলামে -999.99 থেকে 999.99 অবধি সঞ্চিত হতে পারে।

স্ট্যান্ডার্ড এসকিউএল-তে সিনট্যাক্স ডেসিমাল (এম) ডেসিমাল (এম, 0) এর সমান। একইভাবে সিনট্যাক্স ডিসিআইএমএল ডেসিমাল (এম, ০) এর সমতুল্য, যেখানে এম মাইএসকিউএল ডেসিমাল সিনট্যাক্সের এই দুটি রূপকে সমর্থন করে মাইএসকিউএল এর মান নির্ধারণের অনুমতি দেওয়া হয়। এম এর ডিফল্ট মান 10 হয়।

যদি স্কেল 0 হয় তবে DECIMAL মানগুলিতে কোনও দশমিক বিন্দু বা ভগ্নাংশ থাকে না।

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

এটি প্যাকড স্টোরেজ রয়েছে, সুতরাং এটি বর্ণচরের চেয়ে কম জায়গা গ্রহণ করবে ( 18 বাইট, যদি আমি আমার গণিতটি সঠিকভাবে করি ), এবং আমি আশা করি আপনি সরাসরি এটিতে গণিত করতে সক্ষম হবেন তবে আমি কখনও কি ঘটে যায় তা দেখার জন্য কোনও বৃহত সংখ্যার সাথে চেষ্টা করে দেখেনি।


8

আমি নিজেকে এই প্রশ্ন জিজ্ঞাসা করতে পেয়েছি এবং আমি যে সমস্ত পোস্ট পড়েছি তা থেকে কখনও কোনও পারফরম্যান্সের তুলনা পাওয়া যায় নি। সুতরাং এখানে আমার প্রচেষ্টা।

আমি নিম্নলিখিত টেবিলগুলি তৈরি করেছি, 100 টি এলোমেলো নেটওয়ার্ক থেকে 2,000,000 এলোমেলো আইপি ঠিকানা দিয়ে জনবহুল।

CREATE TABLE ipv6_address_binary (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr BINARY(16) NOT NULL UNIQUE
);

CREATE TABLE ipv6_address_twobigints (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    haddr BIGINT UNSIGNED NOT NULL,
    laddr BIGINT UNSIGNED NOT NULL,
    UNIQUE uidx (haddr, laddr)
);

CREATE TABLE ipv6_address_decimal (
    id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
    addr DECIMAL(39,0) NOT NULL UNIQUE
);

তারপরে আমি প্রতিটি নেটওয়ার্কের জন্য সমস্ত আইপি ঠিকানা নির্বাচন করি এবং প্রতিক্রিয়া সময়টি রেকর্ড করি। দু'বিগিন্ট টেবিলের গড় প্রতিক্রিয়া সময় প্রায় 1 সেকেন্ড এবং বাইনারি টেবিলে এটি সেকেন্ডের প্রায় একশত ভাগ।

এখানে জিজ্ঞাসা করা হয়।

বিঃদ্রঃ:

এক্স_ [উচ্চতা / নিম্ন] এক্স এর সর্বাধিক / সর্বনিম্ন উল্লেখযোগ্য 64-বিট

NETMASK_LOW যখন 0 হয় এবং শর্তটি বাদ দেওয়া হয় কারণ এটি সর্বদা সত্য হয়। পারফরম্যান্স খুব একটা প্রভাবিত করে না।

SELECT COUNT(*) FROM ipv6_address_twobigints
WHERE haddr & NETMASK_HIGH = NETWORK_HIGH
AND laddr & NETMASK_LOW = NETWORK_LOW

SELECT COUNT(*) FROM ipv6_address_binary
WHERE addr >= NETWORK
AND addr <= BROADCAST

SELECT COUNT(*) FROM ipv6_address_decimal
WHERE addr >= NETWORK
AND addr <= BROADCAST

গড় প্রতিক্রিয়া সময়:

গড় প্রতিক্রিয়া সময়

BINARY_InnoDB  0.0119529819489
BINARY_MyISAM  0.0139244818687
DECIMAL_InnoDB 0.017379629612
DECIMAL_MyISAM 0.0179929423332
BIGINT_InnoDB  0.782350552082
BIGINT_MyISAM  1.07809265852

2

আমি বিশ্বাস করি যে এটি কেবল varchar(39)ক্ষেত্রের মধ্যে সংরক্ষণ করা ছাড়া অন্য একমাত্র বিকল্প ।


2
আমি মনে করি যদি আপনি কেবল ডেটা সঞ্চয় করতে চান তবে এটি কাজ করবে।
এফাই

1
@ আইফাই: সে কি তাই জিজ্ঞাসা করছে না? "আমার 128 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার" সংরক্ষণ করতে হবে "
বেনভ

ওহ হ্যাঁ, এটি একটি ভাল পরামর্শ, আমি কেবল কিছু ক্যালক না করে কেবল সঞ্চয় করতে চাই তা নিশ্চিত করার জন্য মন্তব্য করেছিলাম।
এফাই

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