MySQL
जानकारी का प्रकार
खोज…
निहित / स्वचालित कास्टिंग
select '123' * 2;
2
MySQL के साथ गुणा करने के लिए स्वचालित रूप से स्ट्रिंग 123
को एक संख्या में परिवर्तित करता है।
प्रतिलाभ की मात्रा:
246
किसी संख्या में रूपांतरण बाएं से दाएं शुरू होता है। यदि रूपांतरण संभव नहीं है तो परिणाम 0
select '123ABC' * 2
प्रतिलाभ की मात्रा:
246
select 'ABC123' * 2
प्रतिलाभ की मात्रा:
0
VARCHAR (255) - या नहीं
सुझाया गया अधिकतम लेन
सबसे पहले, मैं कुछ सामान्य तारों का उल्लेख करूंगा जो हमेशा हेक्स हैं, या अन्यथा एएससीआईआई तक सीमित हैं। इनके लिए, आपको CHARACTER SET ascii
( latin1
ठीक है) निर्दिष्ट करना चाहिए ताकि यह स्थान बर्बाद न करे:
UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max
city VARCHAR(100) -- This Russian town needs 91:
Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow
सिर्फ 255 क्यों नहीं? सब कुछ के लिए (255) का उपयोग करने के सामान्य अभ्यास से बचने के दो कारण हैं।
- जब एक जटिल
SELECT
को अस्थायी तालिका (एक सबक्वेरी,UNION
,GROUP BY
आदि के लिए) बनाने की आवश्यकता होती है, तो पसंदीदा विकल्पMEMORY
इंजन का उपयोग करना है, जो रैम में डेटा डालता है। लेकिनVARCHARs
को प्रक्रिया मेंCHAR
में बदल दिया जाता है। इससेVARCHAR(255) CHARACTER SET utf8mb4
1020 बाइट लेती है। यह डिस्क को फैलाने की आवश्यकता को जन्म दे सकता है, जो धीमा है। - कुछ स्थितियों में, InnoDB एक तालिका में स्तंभों के संभावित आकार को देखेगा और तय करेगा कि यह बहुत बड़ा होगा, एक
CREATE TABLE
गर्भपात कर रहा है।
VARCHAR बनाम पाठ
*TEXT
, CHAR
, और VARCHAR
, और कुछ सर्वोत्तम अभ्यासों के लिए उपयोग संकेत:
-
TINYTEXT
उपयोग कभी न करें। - लगभग कभी
CHAR
उपयोग नहीं करते - यह निश्चित लंबाई है; प्रत्येक वर्णCHARACTER SET
की अधिकतम लंबाई है (उदाहरण के लिए, utf8mb4 के लिए 4 बाइट्स / वर्ण)। -
CHAR
साथ,CHARACTER SET ascii
उपयोग करें जब तक आप अन्यथा नहीं जानते। -
VARCHAR(n)
n वर्णों में छोटा हो जाएगा;TEXT
कुछ बाइट्स की संख्या को कम कर देगा। (लेकिन, क्या आप ट्रंकेशन चाहते हैं?) -
*TEXT
SELECTs
जटिल तालिकाओं को धीमा कर सकता है क्योंकि अस्थायी तालिकाओं को कैसे संभाला जाता है।
AUTO_INCREMENT के रूप में INT
INT
किसी भी आकार का उपयोग AUTO_INCREMENT
लिए किया जा सकता है। UNSIGNED
हमेशा उपयुक्त होता है।
ध्यान रखें कि कुछ ऑपरेशन " AUTO_INCREMENT
id" बर्न करते हैं। इससे अप्रत्याशित अंतर पैदा हो सकता है। उदाहरण: INSERT IGNORE
और REPLACE
। वे महसूस करने से पहले एक आईडी का प्रचार कर सकते हैं कि इसकी आवश्यकता नहीं होगी। यह अपेक्षित व्यवहार है और इनोबीडी इंजन में डिजाइन द्वारा और उनके उपयोग को हतोत्साहित नहीं करना चाहिए।
अन्य
"FLOAT, DOUBLE, और DECIMAL" और "ENUM" के लिए पहले से ही एक अलग प्रविष्टि है। डेटाटाइप्स पर एक एकल पृष्ठ अनधिकृत होने की संभावना है - मैं सुझाव देता हूं कि "फ़ील्ड प्रकार" (या इसे "डेटाटिप्स" कहा जाना चाहिए?) एक सिंहावलोकन हो, फिर इन विषय पृष्ठों में विभाजित करें:
- INTs
- फ़्लोट, डबल और डेमल
- स्ट्रिंग्स (CHARs, TEXT, आदि)
- BINARY और BLOB
- DATETIME, TIMESTAMP, और मित्र
- ENUM और SET
- स्थानिक डेटा
- JSON प्रकार (MySQL 5.7.8+)
- कैसे पैसे का प्रतिनिधित्व करने के लिए, और अन्य सामान्य 'प्रकार' जिन्हें मौजूदा डेटाटाइप्स में जूते की आवश्यकता होती है
जहाँ उपयुक्त हो, प्रत्येक विषय पृष्ठ में सिंटैक्स और उदाहरणों के अलावा शामिल होना चाहिए:
- जब बदलाव हो
- आकार (बाइट्स)
- गैर-MySQL इंजन के साथ विरोधाभासी (कम प्राथमिकता)
- प्राथमिक कुंजी या द्वितीयक कुंजी में डेटाटाइप का उपयोग करते समय विचार
- अन्य सर्वोत्तम अभ्यास
- अन्य प्रदर्शन मुद्दों
(मुझे लगता है कि यह "उदाहरण" आत्म-विघटन होगा जब मेरे सुझाव संतुष्ट या वीटो किए गए हैं।)
परिचय (संख्यात्मक)
MySQL विभिन्न संख्यात्मक प्रकार प्रदान करता है। इन्हें तोड़ा जा सकता है
समूह | प्रकार |
---|---|
पूर्णांक प्रकार | INTEGER , INT , SMALLINT , TINYINT , MEDIUMINT , BIGINT |
निश्चित बिंदु प्रकार | DECIMAL , NUMERIC |
फ्लोटिंग पॉइंट प्रकार | FLOAT , DOUBLE |
बिट वैल्यू टाइप | BIT |
पूर्णांक प्रकार
न्यूनतम अहस्ताक्षरित मान हमेशा 0 होता है।
प्रकार | भंडारण (बाइट) | न्यूनतम मूल्य (हस्ताक्षर) | अधिकतम मूल्य (हस्ताक्षर) | अधिकतम मूल्य (अहस्ताक्षरित) |
---|---|---|---|---|
TINYINT | 1 | -2 7 -128 | 2 7 -1 127 | 2 8 -1 255 |
SMALLINT | 2 | -2 15 -32,768 | 2 15 -1 32,767 | 2 16 -1 65,535 |
MEDIUMINT | 3 | -2 23 -+८३,८८,६०८ | २ २३ -१ 8,388,607 | २ २४ -१ 16,777,215 |
INT | 4 | -2 31 -+२१४७४८३६४८ | २ ३१ -१ 2,147,483,647 | 2 32 -1 +४२९४९६७२९५ |
BIGINT | 8 | -2 63 -9.223.372.036.854.775.808 | 2 63 -1 9.223.372.036.854.775.807 | 2 64 -1 18.446.744.073.709.551.615 |
निश्चित बिंदु प्रकार
MySQL के DECIMAL
और NUMERIC
प्रकार सटीक संख्यात्मक डेटा मूल्यों को संग्रहीत करते हैं। पैसे के लिए सटीक सटीकता को संरक्षित करने के लिए इन प्रकारों का उपयोग करने की सिफारिश की जाती है।
दशमलव
ये मान बाइनरी प्रारूप में संग्रहीत हैं। एक कॉलम घोषणा में, सटीक और पैमाने निर्दिष्ट किया जाना चाहिए
परिशुद्धता उन महत्वपूर्ण अंकों की संख्या का प्रतिनिधित्व करती है जो मूल्यों के लिए संग्रहीत होते हैं।
स्केल दशमलव के बाद संग्रहीत अंकों की संख्या का प्रतिनिधित्व करता है
salary DECIMAL(5,2)
5 precision
प्रतिनिधित्व करता precision
और 2 scale
प्रतिनिधित्व करता है। इस उदाहरण के लिए, इस कॉलम में संग्रहीत मूल्यों की श्रेणी -999.99 to 999.99
यदि स्केल पैरामीटर को छोड़ दिया जाता है, तो यह 0 से चूक जाता है
यह डेटा प्रकार 65 अंकों तक संग्रहीत कर सकता है।
DECIMAL(M,N)
द्वारा लिए गए बाइट्स की संख्या लगभग M/2
।
फ्लोटिंग पॉइंट प्रकार
FLOAT
और DOUBLE
अनुमानित डेटा प्रकारों का प्रतिनिधित्व करते हैं।
प्रकार | भंडारण | शुद्धता | रेंज |
---|---|---|---|
फ्लोट | 4 निवाले | 23 महत्वपूर्ण बिट्स / ~ 7 दशमलव अंक | 10 ^ + / - 38 |
डबल | 8 बाइट्स | 53 महत्वपूर्ण बिट्स / ~ 16 दशमलव अंक | 10 ^ + / - 308 |
REAL
FLOAT
पर्याय है। DOUBLE PRECISION
के लिए एक पर्याय है DOUBLE
।
हालाँकि MySQL भी अनुमति देता है (M, D) क्वालीफायर, इसका उपयोग न करें। (एम, डी) का अर्थ है कि मूल्यों को एम कुल अंकों तक संग्रहीत किया जा सकता है, जहां डी दशमलव के बाद हो सकता है। संख्याओं को दो बार गोल या काट दिया जाएगा; यह लाभ से अधिक परेशानी का कारण होगा।
चूँकि फ़्लोटिंग-पॉइंट मान अनुमानित होते हैं और सटीक मानों के रूप में संग्रहीत नहीं होते हैं, इसलिए तुलनात्मक रूप से उनका इलाज करने का प्रयास समस्याओं का कारण बन सकता है। विशेष रूप से ध्यान दें कि एक FLOAT
मान शायद ही एक DOUBLE
मान के बराबर होता है।
बिट वैल्यू टाइप
बिट-फ़ील्ड मान संग्रहीत करने के लिए BIT
प्रकार उपयोगी है। BIT(M)
एम-बिट मूल्यों तक भंडारण की अनुमति देता है जहां एम 1 to 64
की सीमा में है
आप bit value
नोटेशन के साथ मान भी निर्दिष्ट कर सकते हैं।
b'111' -> 7
b'10000000' -> 128
कभी-कभी एकल-बिट मान के निर्माण के लिए 'शिफ्ट' का उपयोग करना आसान होता है, उदाहरण के लिए (1 << 7)
128 के लिए।
NDB
तालिका में सभी बीआईटी कॉलम का अधिकतम संयुक्त आकार 4096 है।
CHAR (एन)
CHAR(n)
n
वर्णों की एक निश्चित लंबाई की एक स्ट्रिंग है। यदि यह CHARACTER SET utf8mb4
, तो इसका मतलब है कि यह क्या है, इस पर ध्यान दिए बिना 4*n
बाइट्स हैं ।
CHAR(n)
लिए अधिकांश उपयोग के मामलों में ऐसे तार शामिल होते हैं जिनमें अंग्रेजी वर्ण होते हैं, इसलिए CHARACTER SET ascii
होना चाहिए। ( latin1
उतना ही अच्छा करेगा।)
country_code CHAR(2) CHARACTER SET ascii,
postal_code CHAR(6) CHARACTER SET ascii,
uuid CHAR(39) CHARACTER SET ascii, -- more discussion elsewhere
DATE, DATETIME, TIMESTAMP, YEAR और TIME
DATE
डेटाटाइप में दिनांक शामिल है लेकिन कोई समय घटक नहीं है। इसका प्रारूप 'YYYY-MM-DD'
'1000-01-01' से लेकर '9999-12-31' तक है।
DATETIME
प्रकार में 'YYYY-MM-DD HH: MM: SS' के प्रारूप के साथ समय शामिल है। इसकी रेंज '1000-01-01 00:00:00' से '9999-12-31 23:59:59' है।
TIMESTAMP
प्रकार एक पूर्णांक प्रकार है जिसमें दिनांक और समय प्रभावी सीमा के साथ '1970-01-01 00:00:01' UTC से '2038-01-19 03:14:07' UTC होता है।
YEAR
प्रकार एक वर्ष का प्रतिनिधित्व करता है और 1901 से 2155 तक की सीमा रखता है।
TIME
प्रकार 'HH: MM: SS' के प्रारूप के साथ एक समय का प्रतिनिधित्व करता है और '-838: 59: 59' से '838: 59: 59' तक की सीमा रखता है।
भंडारण आवश्यकताएँ:
|-----------|--------------------|----------------------------------------|
| Data Type | Before MySQL 5.6.4 | as of MySQL 5.6.4 |
|-----------|--------------------|----------------------------------------|
| YEAR | 1 byte | 1 byte |
| DATE | 3 bytes | 3 bytes |
| TIME | 3 bytes | 3 bytes + fractional seconds storage |
| DATETIME | 8 bytes | 5 bytes + fractional seconds storage |
| TIMESTAMP | 4 bytes | 4 bytes + fractional seconds storage |
|-----------|--------------------|----------------------------------------|
आंशिक सेकंड (संस्करण 5.6.4 के रूप में):
|------------------------------|------------------|
| Fractional Seconds Precision | Storage Required |
|------------------------------|------------------|
| 0 | 0 bytes |
| 1,2 | 1 byte |
| 3,4 | 2 byte |
| 5,6 | 3 byte |
|------------------------------|------------------|
समय मानों में MySQL के मैनुअल पेज DATE, DATETIME और TIMESTAMP प्रकार , डेटा प्रकार संग्रहण आवश्यकताएँ और आंशिक सेकंड्स देखें ।