MySQL में प्रकार: BigInt (20) बनाम इंट (20)


221

मैं अंतर के बीच क्या सोच रहा था BigInt, MediumIntहै, और Intकर रहे हैं ... यह स्पष्ट है कि वे बड़ी संख्या के लिए अनुमति होगी प्रतीत होता है; हालाँकि, मैं एक Int(20)या एक बना सकता हूँ BigInt(20)और यह प्रतीत होता है कि यह जरूरी नहीं कि आकार के बारे में है।

कुछ अंतर्दृष्टि भयानक होगी, बस जिज्ञासु की तरह। मैं कुछ समय से MySQL का उपयोग कर रहा हूं और प्रकार चुनते समय व्यावसायिक आवश्यकताओं को लागू करने की कोशिश कर रहा हूं, लेकिन मैंने इस पहलू को कभी नहीं समझा।

जवाबों:


479

Http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html देखें

  • INT एक चार-बाइट हस्ताक्षरित पूर्णांक है।

  • BIGINT एक आठ-बाइट हस्ताक्षरित पूर्णांक है।

वे प्रत्येक को अधिक नहीं स्वीकार करते हैं और बाइट्स को उनकी संबंधित संख्या में संग्रहीत नहीं किया जा सकता है। इसका मतलब है कि एक में 2 32 मान और एक में INT2 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 |
+----------------------+

यह MySQL उपयोगकर्ताओं के लिए भ्रम का एक सामान्य स्रोत है INT(20)और यह एक आकार सीमा है, जिसके अनुरूप कुछ है CHAR(20)। यह मामला नहीं है।


4
वाह, इस पोस्ट ने इस विषय पर मेरे भ्रम को पूरी तरह से साफ कर दिया। डेवलपर्स द्वारा एक अजीब पसंद की तरह लगता है - जैसा कि मैंने अनुमान लगाया था कि यह चौड़ाई + अधिकतम मूल्य, या बिट्स / आदि था।
Sh4d0wsPlyr

27
`यह केवल शून्य विकल्प को प्रभावित करता है:` अब मेरी जिज्ञासा समाप्त होती है
उमर

6
मैं वास्तव में चाहता हूं कि उन्होंने INT के बजाय ZEROFILL पर डिस्प्ले के साथ सिंटैक्स डिज़ाइन किया था। उदाहरण: bar INT ZEROFILL(20)। यह बहुत अधिक स्पष्ट होता। लेकिन यह निर्णय बहुत समय पहले किया गया था, और अब इसे बदलने से लाखों डेटाबेस इंस्टालेशन टूट जाएंगे।
बिल कार्विन

1
मैं मानता हूं कि यह बहुत भ्रामक है। मैं इस धारणा के तहत था कि संख्या इस पूरे समय की सीमा थी। यहां तक ​​कि कुछ संख्याओं को छोटा करने के बारे में चिंतित जब मुझे पता था कि डेटा एक निश्चित सीमा के भीतर होगा।
jDub9

2
@ jDub9, हाँ, और यह और भी भ्रामक है कि NUMERIC / DECIMAL एक सटीक तर्क लेता है जो मूल्यों की श्रेणी और स्तंभ के आकार को प्रभावित करता है
बिल करविन

40

एक प्रकार की घोषणा में कोष्ठकों की संख्या प्रदर्शन चौड़ाई है , जो उन मानों की श्रेणी से असंबंधित है जिन्हें डेटा प्रकार में संग्रहीत किया जा सकता है। सिर्फ इसलिए कि आप घोषणा कर सकते Int(20)हैं इसका मतलब यह नहीं है कि आप इसमें 10 ^ 20 तक मान स्टोर कर सकते हैं:

[...] इस वैकल्पिक प्रदर्शन चौड़ाई का उपयोग अनुप्रयोगों द्वारा पूर्णांक मानों को प्रदर्शित करने के लिए किया जा सकता है, जो कॉलम के लिए निर्दिष्ट चौड़ाई से कम चौड़ाई वाले होते हैं, जो रिक्त स्थान के साथ उन्हें पेडिंग करते हैं। ...

प्रदर्शन चौड़ाई स्तंभ में संग्रहीत किए जा सकने वाले मानों की श्रेणी को बाधित नहीं करती है, और न ही स्तंभ के लिए निर्दिष्ट चौड़ाई से अधिक वाले मानों के लिए प्रदर्शित अंकों की संख्या। उदाहरण के लिए, SMALLINT (3) के रूप में निर्दिष्ट एक कॉलम में -32768 से लेकर 32767 तक की सामान्य SMALLINT श्रेणी होती है, और तीन वर्णों द्वारा उपयोग की जाने वाली सीमा के बाहर के मान तीन से अधिक वर्णों का उपयोग करके प्रदर्शित किए जाते हैं।

प्रत्येक MySQL डेटाटाइप में संग्रहीत अधिकतम और न्यूनतम मानों की सूची के लिए, यहां देखें ।


18

उद्धरण :

"BIGINT (20)" विनिर्देश एक अंक सीमा नहीं है। इसका अर्थ केवल यह है कि जब डेटा प्रदर्शित किया जाता है, अगर वह 20 अंकों से कम का उपयोग करता है तो इसे शून्य-बाएं पिन किया जाएगा। 2 ^ 64 BIGINT प्रकार के लिए कठिन सीमा है, और इसमें स्वयं 20 अंक हैं, इसलिए BIGINT (20) का अर्थ है कि 10 ^ 20 से कम सब कुछ प्रदर्शन पर रिक्त स्थान के साथ छोड़ दिया जाएगा।


3
2 ^ 64 (अहस्ताक्षरित) वास्तव में 21 अंक हैं। BIGINT (20) खतरनाक है। जो लोग इसका उपयोग करते हैं वे इस विचार पर अपने उपयोग को सही ठहराते हैं कि 2 ^ 64 20 दशमलव अंकों में फिट बैठता है। अगर ऐसा है, तो एक चौड़ाई सीमा बिल्कुल क्यों निर्दिष्ट करें? जैसा कि यह पता चला है, यह भी सही नहीं है। 2 ^ 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 पर माइनस डाल सकते हैं। यदि आप int_10 में 4294967291 डालें तो भी आपको त्रुटि मिलेगीOut of range value for column.....

निष्कर्ष:

  1. int (X) बिना कीवर्ड के zerofill, int रेंज -2147483648 ~ 2147483647 के बराबर है

  2. int (X) कीवर्ड के साथ zerofill, फ़ील्ड अहस्ताक्षरित int श्रेणी 0 ~ 4294967295 के बराबर है, यदि संख्या की लंबाई X से कम है तो यह 0 से बाईं ओर भरेगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.