মাইএসকিউএল মধ্যে প্রকার: বিগআইন্ট (20) বনাম ইন্টার (20)


221

আমি পার্থক্য কি হতাশ ছিল BigInt, MediumIntএবং Intহয় ... এটা সুস্পষ্ট যে তারা বৃহত্তর সংখ্যার জন্য সম্ভব হবে বলে মনে করেন; যাইহোক, আমি একটি Int(20)বা একটি তৈরি করতে পারি BigInt(20)এবং এটি মনে হবে এটি আকারের পক্ষে অগত্যা নয়।

কিছু অন্তর্দৃষ্টি দুর্দান্ত, কেবল কৌতূহলী হবে। আমি কিছুক্ষণের জন্য মাইএসকিউএল ব্যবহার করছি এবং প্রকারগুলি বেছে নেওয়ার সময় ব্যবসায়ের প্রয়োজনগুলি প্রয়োগ করার চেষ্টা করছি, তবে আমি কখনই এই দিকটি বুঝতে পারি নি।

উত্তর:


478

Http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html দেখুন

  • INT একটি চার-বাইট স্বাক্ষরিত পূর্ণসংখ্যা।

  • BIGINT একটি আট-বাইট স্বাক্ষরিত পূর্ণসংখ্যা।

তারা প্রত্যেকে তাদের নিজ নিজ সংখ্যাতে বাইট সংরক্ষণ করতে পারে এবং এর চেয়ে কম মান গ্রহণ করে না। যে 2 মানে 32 একটি মান INTএবং 2 64 একটি মান BIGINT

20 ইন INT(20)এবং এর BIGINT(20)অর্থ প্রায় কিছুই নয়। এটি ডিসপ্লে প্রস্থের জন্য একটি ইঙ্গিত। স্টোরেজের সাথে এর কোনও যোগসূত্র নেই, বা কলামটি মান গ্রহণ করবে এমন মানগুলির ব্যাপ্তি নেই।

ব্যবহারিকভাবে, এটি কেবলমাত্র ZEROFILLবিকল্পকে প্রভাবিত করে :

CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;

+----------------------+
| bar                  |
+----------------------+
| 00000000000000001234 |
+----------------------+

এটি মাইএসকিউএল ব্যবহারকারীদের জন্য INT(20)এটির একটি আকারের সীমা, যা কিছুটা সাদৃশ্যযুক্ত তা দেখে এবং বিভ্রান্তির একটি সাধারণ উত্স CHAR(20)। এই ক্ষেত্রে না হয়.


4
বাহ, এই পোস্টটি পুরোপুরি এই বিষয়ে আমার বিভ্রান্তি পরিষ্কার করেছে। বিকাশকারীদের কাছে একটি অদ্ভুত পছন্দ বলে মনে হচ্ছে - যেহেতু আমি অনুমান করতাম এটির প্রস্থ + সর্বোচ্চ মান, বা বিট / ইত্যাদি।
Sh4d0wsPlyr

27
`এটি কেবল জেরোফিল বিকল্পকে প্রভাবিত করে: my এখন আমার কৌতূহল শেষ হয়
উমায়ের

6
আমি সত্যিই চাই যে তারা INT এর পরিবর্তে ZEROFILL এর সাথে ডিসপ্লেটি সহ সিনট্যাক্সটি ডিজাইন করেছিল। উদাহরণ: bar INT ZEROFILL(20)। এটা আরও অনেক পরিষ্কার ছিল। তবে সেই সিদ্ধান্তটি অনেক দিন আগেই নেওয়া হয়েছিল, এবং এখনই এটি পরিবর্তন করা লক্ষ লক্ষ ডাটাবেস ইনস্টলেশন ভেঙে দেবে।
বিল কারভিন

1
আমি একমত, এটা খুব বিভ্রান্তিকর। আমি এই ছাপে ছিলাম যে পুরো সংখ্যাটি এই সময়ের সীমা ছিল। এমনকি যখন আমি জানতাম যে ডেটা একটি নির্দিষ্ট পরিসরের মধ্যে থাকবে তখন কিছু সংখ্যাকে ছোট করা নিয়েও চিন্তিত।
jDub9

2
@ jDub9, হ্যাঁ, এবং এটি আরও বিভ্রান্তিকর যে NUMERIC / DECIMAL একটি যথার্থ যুক্তি গ্রহণ করে যা মানগুলির পরিসীমা এবং কলামের আকারকে প্রভাবিত করে।
বিল কারভিন

40

কোনও প্রকারের ঘোষণাপত্রে বন্ধনীগুলির সংখ্যা হ'ল ডিসপ্লে প্রস্থ , যা কোনও ডাটা টাইপের ক্ষেত্রে সংরক্ষণ করা যায় এমন মানগুলির সীমার সাথে সম্পর্কিত নয়। আপনি ঘোষণা করতে পারার Int(20)অর্থ এই নয় যে আপনি এতে 10 ^ 20 অবধি মান সংরক্ষণ করতে পারেন:

[...] এই alচ্ছিক ডিসপ্লে প্রস্থটি স্পেস দিয়ে বাম-প্যাডিং করে কলামের জন্য নির্দিষ্ট প্রস্থের চেয়ে কম প্রস্থের পূর্ণ দৈর্ঘ্যের পূর্ণসংখ্যার মান প্রদর্শনের জন্য অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হতে পারে। ...

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

সর্বোচ্চ এবং সর্বনিম্ন মান প্রতিটি মাইএসকিউএল ডাটাটাইপ সংরক্ষণ করা যাবে একটি তালিকার জন্য দেখুন এখানে


18

উদ্ধৃতি :

"BIGINT (20)" স্পেসিফিকেশন কোনও অঙ্কের সীমা নয়। এটির অর্থ হ'ল যখন ডেটা প্রদর্শিত হবে, যদি এটি 20 টিরও কম সংখ্যার ব্যবহার করে তবে এটি জিরো সহ বাম-প্যাডযুক্ত হবে। 2 ^ 64 হ'ল বিগিন্ট টাইপের জন্য হার্ড সীমা, এবং 20 টি নিজেই রয়েছে, সুতরাং বিগিন্ট (20) এর অর্থ হ'ল 10 ^ 20 এর চেয়ে কম যা কিছু আছে তার সমস্ত জায়গাগুলি ডিসপ্লেতে ফাঁকা থাকবে।


3
2 ^ 64 (স্বাক্ষরবিহীন) এর আসলে 21 টি সংখ্যা রয়েছে। BIGINT (20) বিপজ্জনক। যে সমস্ত লোকেরা এটি ব্যবহার করেন তারা মনে করেন যে তাদের ব্যবহারটি 2 দশমিক অঙ্কের সাথে 2 ^ 64 ফিট করে idea যদি এটি হয় তবে কেন একটি প্রস্থের সীমা নির্দিষ্ট করুন? দেখা যাচ্ছে যে এটিও সঠিক নয়। সঠিকভাবে 2 properly 64 প্রদর্শন করতে 21 ডিজিটের প্রয়োজন।
হান্নিকট্ট

@ হিথহানিক্যুট যদি না আমার ভুল হয়, 2 ^ 64 = 18446744073709551616, যার 20 টি সংখ্যা রয়েছে। 21 এর কি আছে বলে আপনি কি করতে পারেন?
ড্রিমার

3

যতদূর আমি জানি, কেবলমাত্র একটি ছোট পার্থক্য তখনই হয় যখন আপনি সারণীর বাইরে থাকা মান সন্নিবেশ করার চেষ্টা করছেন।

উদাহরণগুলিতে আমি ব্যবহার করব 401421228216, যা হ'ল 101110101110110100100011101100010111000(দৈর্ঘ্য 39 অক্ষর)

  • আপনার যদি INT(20)সিস্টেমের জন্য থাকে তবে এর অর্থ স্মৃতিতে সর্বনিম্ন 20 বিট বরাদ্দ করুন। তবে আপনি যদি এর চেয়ে বড় মান সন্নিবেশ করান 2^20তবে এটি সফলভাবে সংরক্ষণ করা হবে, কেবল যদি এটির চেয়ে কম হয় INT(32) -> 2147483647(বা এর 2 * INT(32) -> 4294967295জন্য UNSIGNED)

উদাহরণ:

mysql> describe `test`;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(20) unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected, 1 warning (0,06 sec)

mysql> SELECT * FROM `test`;
+------------+
| id         |
+------------+
| 4294967295 |
+------------+
1 row in set (0,00 sec)
  • আপনার যদি BIGINT(20)সিস্টেমের জন্য থাকে তবে এর অর্থ স্মৃতিতে সর্বনিম্ন 20 বিট বরাদ্দ করুন। তবে আপনি যদি এর চেয়ে বড় মান সন্নিবেশ করান 2^20তবে এটি সফলভাবে সংরক্ষণ করা হবে, যদি এটির চেয়ে কম হয় BIGINT(64) -> 9223372036854775807(বা এর 2 * BIGINT(64) -> 18446744073709551615জন্য UNSIGNED)

উদাহরণ:

mysql> describe `test`;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | bigint(20) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected (0,04 sec)

mysql> SELECT * FROM `test`;
+--------------+
| id           |
+--------------+
| 401421228216 |
+--------------+
1 row in set (0,00 sec)

1

আমি যোগ করতে আরো এক বিন্দু, যদি আপনি 902054990011312 মত সত্যিই একটি সংখ্যক সঞ্চয় করেছেন তারপর এক সহজে এর পার্থক্য দেখতে পারেন চেয়েছিলেন INT(20)এবং BIGINT(20)। এটি সংরক্ষণ করার পরামর্শ দেওয়া হচ্ছে BIGINT


1

জিরোফিল কীওয়ার্ড সহ একটি (10) এর জন্য একটি উদাহরণ দেই, একটি নয়, টেবিলটি এটি পছন্দ করে:

create table tb_test_int_type(
    int_10 int(10),
    int_10_with_zf int(10) zerofill,
    unit int unsigned
);

আসুন কিছু তথ্য প্রবেশ করান:

insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647) 
;

তারপর

select * from tb_test_int_type; 

# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'

আমরা সেটা দেখতে পারি

  • কীওয়ার্ড সহ zerofill, 10 এর চেয়ে কম সংখ্যা 0 পূরণ করবে, তবে এটি ছাড়া zerofillহবে না

  • দ্বিতীয়ত কীওয়ার্ড সহ zerofill, int_10_with_zf স্বাক্ষরবিহীন int টাইপ হয়ে যায়, আপনি যদি একটি বিয়োগ সন্নিবেশ করেন তবে আপনি ত্রুটি পাবেন Out of range value for column.....। তবে আপনি int_10 এ বিয়োগ .োকাতে পারেন। এছাড়াও আপনি যদি 4294967291 টি int_10 তে .োকান তবে আপনি ত্রুটি পাবেনOut of range value for column.....

উপসংহার:

  1. কীওয়ার্ড ছাড়াই zerofillইন্টি (এক্স) , ইন্টার রেঞ্জ -2147483648 ~ 2147483647 এর সমান

  2. কিওয়ার্ড সহ int (এক্স) zerofill, ক্ষেত্রটি স্বাক্ষরবিহীন int রেঞ্জ 0 ~ 4294967295 এর সমান, যদি সংখ্যাটির দৈর্ঘ্য X এর চেয়ে কম হয় তবে এটি 0 টি বামে পূরণ করবে

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