2010-06-28 14 views
143

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

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

उत्तर

304

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

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

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

वे प्रत्येक अपने बाइट्स की संख्या में संग्रहीत किए जाने से अधिक और कम मूल्य स्वीकार नहीं करते हैं। इसका मतलब है 0 INT और 2 मान BIGINT में मान।

20 में INT(20) और BIGINT(20) का अर्थ लगभग कुछ भी नहीं है। यह प्रदर्शन चौड़ाई के लिए एक संकेत है। इसका भंडारण करने के लिए कुछ भी नहीं है, न ही मूल्यों की सीमा जो कॉलम स्वीकार करेगी।

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

+----------------------+ 
| bar     | 
+----------------------+ 
| 000000000000000| 
+----------------------+ 

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

व्यावहारिक रूप से, यह केवल ZEROFILL विकल्प को प्रभावित करता है। यह मामला नहीं है।

+1

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

+7

'यह केवल जेरोफिल विकल्प को प्रभावित करता है:' अब मेरी जिज्ञासा – Umair

+2

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

34

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

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

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

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

+1

आप [यहां] मतलब (http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)? – WAF

12

Quote:

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

+2

2^64 (हस्ताक्षरित) वास्तव में 21 अंक हैं। बिगिनट (20) खतरनाक है। जो लोग इसका उपयोग करते हैं, वे इस विचार पर अपने उपयोग को औचित्य साबित करते हैं कि 2^64 20 दशमलव अंकों में फिट बैठता है। यदि ऐसा है, तो चौड़ाई सीमा निर्दिष्ट क्यों करें? जैसा कि यह पता चला है, यह भी सही नहीं है। ठीक से 2^64 प्रदर्शित करने के लिए 21 अंकों की आवश्यकता है। –

1

मैं जोड़ने के लिए एक और बात, अगर आप 902054990011312 की तरह एक बहुत बड़ी संख्या में भंडारण कर रहे हैं तो एक आसानी से INT(20) और BIGINT(20) का अंतर देख सकते हैं चाहता था। BIGINT में स्टोर करने की सलाह दी जाती है।

0

जहां तक ​​मुझे पता है, केवल एक छोटा अंतर है जब आप सीमा से बाहर मूल्य डालने की कोशिश कर रहे हैं।

उदाहरण में मैं 401421228216, इस्तेमाल करेंगे जो 101110101110110100100011101100010111000 (लंबाई वर्ण)

  • है आप इस प्रणाली के लिए INT(20) है, तो इसका मतलब यह है स्मृति न्यूनतम 20 बिट्स में आवंटित। लेकिन अगर आप मूल्य प्रविष्ट किए जाने वाले से बड़े 2^20, इसे सफलतापूर्वक संग्रहीत किया जाएगा कि, केवल अगर यह कम INT(32) -> 2147483647 (या 2 * INT(32) -> 4294967295UNSIGNED के लिए)

उदाहरण:

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) -> 18446744073709551615UNSIGNED के लिए)

उदाहरण:

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) 
संबंधित मुद्दे