MySQL მსოფლიოში ყველაზე პოპულარული ღია კოდის მქონე მონაცემთა ბაზის მართვის სისტემაა. მონაცემთა ბაზები წარმოადგენს ყველა პროგრამული აპლიკაციისთვის აუცილებელ მონაცემთა საცავებს. მაგალითად, როდესაც ვინმე აკეთებს ვებ ძიებას, შედის საკუთარ ანგარიშში ან ასრულებს ტრანზაქციას, მონაცემთა ბაზა ინახავს ამ ინფორმაციას, რათა მომავალში ის ხელმისაწვდომი იყოს. MySQL ამ ამოცანას ძალიან კარგად ასრულებს.
SQL (Structured Query Language) არის პროგრამირების ენა, რომელიც გამოიყენება მონაცემების სამართავად, რაც გულისხმობს მონაცემების ამოღებას, განახლებას, დამატებასა და წაშლას. MySQL არის SQL-ზე დაფუძნებული რელაციური მონაცემთა ბაზა, რომელიც შექმნილია სტრუქტურირებული მონაცემების შესანახად და სამართავად.
MySQL-ში მონაცემთა ტიპები სამ ძირითად ჯგუფად იყოფა:
რიცხვითი, თარიღი და დრო და სტრიქონის ტიპები.
MySQL მხარს უჭერს SQL-ის ყველა სტანდარტულ რიცხვით მონაცემთა ტიპს. ეს ტიპები მოიცავს როგორც ზუსტ რიცხვით ტიპებს (INTEGER, SMALLINT, DECIMAL და NUMERIC), ასევე მიახლოებულ, ათწილადური სტილის რიცხვით ტიპებს (FLOAT, REAL და DOUBLE PRECISION).
საკვანძო სიტყვა INT წარმოადგენს INTEGER-ის სინონიმს, ხოლო DEC და FIXED — DECIMAL-ის სინონიმებია. MySQL განიხილავს DOUBLE-ს როგორც DOUBLE PRECISION-ის სინონიმს (არასტანდარტული გაფართოება). ასევე, MySQL REAL-ს აღიქვამს როგორც DOUBLE PRECISION-ის სინონიმს (არასტანდარტული ვარიაცია), გარდა იმ შემთხვევისა, როცა ჩართულია REAL_AS_FLOAT SQL რეჟიმი.
რიცხვითი ტიპები გამოიყენება მთელი და წილადი რიცხვების შესანახად. სტანდარტის გაფართოების სახით, MySQL ასევე მხარს უჭერს მთელ რიცხვით ტიპებს: TINYINT, MEDIUMINT და BIGINT. ქვემოთ მოცემული ცხრილი აჩვენებს თითოეული ტიპის შესახებ საჭირო ინფორმაციას.
| ტიპი | მეხსიერება (ბაიტები) | მინ. მნიშვნელობა (signed) | მინ. მნიშვნელობა (unsigned) | მაქს. მნიშვნელობა (signed) | მაქს. მნიშვნელობა (unsigned) |
|---|---|---|---|---|---|
TINYINT |
1 | -128 | 0 | 127 | 255 |
SMALLINT |
2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT |
3 | -8388608 | 0 | 8388607 | 16777215 |
INT |
4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT |
8 | -263 | 0 | 263 - 1 | 264 - 1 |
FLOAT |
4 |
მცურავი წერტილის რიცხვი (მიახლოებითი). გამოიყენება მაშინ, როცა სიზუსტე კრიტიკული არ არის.
0-დან 23-მდე სიზუსტე იწვევს 4-ბაიტიან FLOAT-ს.
MySQL მნიშვნელობების შენახვისას ახორციელებს დამრგვალებას. მაგალითად, თუ FLOAT(7,4) სვეტში შეიტანთ 999.00009-ს, შედეგი იქნება დაახლოებით 999.0001.
FLOAT(M,D) და DOUBLE(M,D) წარმოადგენს MySQL-ის არასტანდარტულ გაფართოებებს და უკვე მოძველებულად (deprecated) ითვლება. მოსალოდნელია, რომ მომავალ ვერსიებში მათი მხარდაჭერა მოიხსნება.
|
|||
DOUBLE |
8 |
ორმაგი სიზუსტის (მიახლოებითი) მცურავი წერტილის რიცხვი. 24-დან 53-მდე სიზუსტე იწვევს 8-ბაიტიან DOUBLE-ს.
რადგან მცურავი წერტილის (floating-point) მნიშვნელობები მიახლოებით ინახება და არა ზუსტად, შედარებებში მათი ზუსტ მნიშვნელობებად გამოყენება შეიძლება პრობლემური იყოს. ასევე, მათი ქცევა შეიძლება დამოკიდებული იყოს პლატფორმაზე ან იმპლემენტაციაზე.
მაქსიმალური პორტაბელურობისთვის, კოდში, რომელიც იყენებს მიახლოებულ რიცხვით მონაცემებს, რეკომენდებულია FLOAT ან DOUBLE PRECISION გამოყენება ყოველგვარი დამატებითი სიზუსტის ან ციფრების რაოდენობის მითითების გარეშე.
|
|||
DECIMAL(M,D) |
ცვლადი |
ფიქსირებული სიზუსტის რიცხვი (ზუსტი).
გამოიყენება ფინანსურ და ზუსტ გამოთვლებში.
M — ციფრების საერთო რაოდენობა,
D — ათწილადი ციფრების რაოდენობა.
ნაგულისხმევი მნიშვნელობა M-ისთვის არის 10.
ინახება ზუსტად (არ აქვს floating-point შეცდომები).
DECIMAL-ის მაქსიმალური ციფრების რაოდენობა არის 65, თუმცა კონკრეტული სვეტის რეალური დიაპაზონი შეიძლება შეიზღუდოს მისი სიზუსტითა და მასშტაბით. MySQL-ში NUMERIC რეალურად განხორციელებულია როგორც DECIMAL.
|
|||
თარიღისა და დროის მონაცემთა ტიპები, რომლებიც გამოიყენება დროის, თარიღის ან მათი კომბინაციის მნიშვნელობების წარმოსადგენად, არის: DATE, TIME, DATETIME, TIMESTAMP და YEAR.
თითოეულ დროით ტიპს აქვს დასაშვები მნიშვნელობების საკუთარი დიაპაზონი, ასევე „ნულოვანი“ (zero) მნიშვნელობა, რომელიც შეიძლება გამოყენებულ იქნას იმ შემთხვევაში, როდესაც მითითებული მნიშვნელობა არასწორია და MySQL ვერ ახერხებს მის წარმოდგენას.
| ტიპი | ფორმატი | აღწერა |
|---|---|---|
DATE |
YYYY-MM-DD |
DATE ტიპი გამოიყენება იმ მნიშვნელობებისთვის, რომლებიც შეიცავს მხოლოდ თარიღს და არ შეიცავს დროს. MySQL DATE მნიშვნელობებს აბრუნებს და აჩვენებს ფორმატში 'YYYY-MM-DD'. მხარდაჭერილი დიაპაზონია '1000-01-01'-დან '9999-12-31'-მდე.
მაგ: 1973-12-30
|
DATETIME |
YYYY-MM-DD hh:mm:ss |
DATETIME ტიპი გამოიყენება იმ მნიშვნელობებისთვის, რომლებიც შეიცავს როგორც თარიღს, ასევე დროს. MySQL DATETIME მნიშვნელობებს აბრუნებს და აჩვენებს ფორმატში 'YYYY-MM-DD hh:mm:ss'. მხარდაჭერილი დიაპაზონია '1000-01-01 00:00:00'-დან '9999-12-31 23:59:59'-მდე.
მაგ: 1973-12-30 15:30:00
|
TIMESTAMP |
YYYY-MM-DD hh:mm:ss |
TIMESTAMP მონაცემთა ტიპი გამოიყენება იმ მნიშვნელობებისთვის, რომლებიც შეიცავს როგორც თარიღს, ასევე დროს. TIMESTAMP-ის დიაპაზონია '1970-01-01 00:00:01' UTC-დან '2038-01-19 03:14:07' UTC-მდე. MySQL ინახავს TIMESTAMP ტიპის მნიშვნელობებს UTC ფორმატში: შენახვისას ისინი გარდაიქმნებიან მიმდინარე დროის სარტყელიდან (time zone) UTC-ში, ხოლო წაკითხვისას - UTC-დან ისევ მიმდინარე დროის სარტყელში. (ეს ქცევა არ ვრცელდება სხვა ტიპებზე, მაგალითად DATETIME-ზე.) ნაგულისხმევად, თითოეული კავშირის (connection) მიმდინარე დროის სარტყელი ემთხვევა სერვერის დროს, თუმცა მისი შეცვლა შესაძლებელია თითოეული კავშირის დონეზე. თუ დროის სარტყელი უცვლელი რჩება, შენახული და მიღებული მნიშვნელობები ერთმანეთს დაემთხვევა. მაგრამ თუ TIMESTAMP მნიშვნელობას შეინახავთ და შემდეგ შეცვლით დროის სარტყელს, მიღებული მნიშვნელობა განსხვავებული იქნება შენახულისგან. ეს ხდება იმიტომ, რომ გარდაქმნისას (შენახვა/წაკითხვა) სხვადასხვა დროის სარტყელი გამოიყენება.
მიმდინარე დროის სარტყელის მნიშვნელობა ხელმისაწვდომია სისტემურ ცვლადში time_zone.
|
TIME |
HH:MM:SS |
MySQL TIME ტიპის მნიშვნელობებს აბრუნებს და აჩვენებს ფორმატში 'hh:mm:ss' (ან 'hhh:mm:ss', როდესაც საათების მნიშვნელობა დიდია). TIME მნიშვნელობების დიაპაზონია '-838:59:59'-დან '838:59:59'-მდე.
საათების ნაწილი შეიძლება ასეთი დიდი იყოს, რადგან TIME ტიპი გამოიყენება არა მხოლოდ დღის დროის (რომელიც 24 საათზე ნაკლებია) წარმოსადგენად, არამედ გასული დროის ან ორი მოვლენის შორის ინტერვალის აღსანიშნად (რომელიც შეიძლება იყოს 24 საათზე ბევრად მეტი ან უარყოფითიც კი).
ნაგულისხმევად, მნიშვნელობები, რომლებიც სცდება TIME დიაპაზონს, მაგრამ სხვა მხრივ სწორია, იჭრება (clipped) დიაპაზონის უახლოეს საზღვრამდე. მაგალითად, '-850:00:00' და '850:00:00' გარდაიქმნება შესაბამისად '-838:59:59' და '838:59:59'-ად.
არასწორი (invalid) TIME მნიშვნელობები გარდაიქმნება '00:00:00'-ად. უნდა აღინიშნოს, რომ რადგან '00:00:00' თვითონაც სწორი TIME მნიშვნელობაა, შეუძლებელია განვასხვავოთ - ცხრილში შენახული '00:00:00' სწორედ ეს მნიშვნელობა იყო თავდაპირველად თუ არასწორი მონაცემის შედეგად იქნა მიღებული.
|
YEAR |
YYYY |
MySQL YEAR მნიშვნელობებს აჩვენებს ფორმატში YYYY, რომლის მხარდაჭერილი დიაპაზონია 1901–2155 და ასევე 0000.
YEAR ტიპი იღებს მნიშვნელობებს სხვადასხვა ფორმატში:
YEAR მნიშვნელობებს გარდაქმნის 0000-ში. strict SQL რეჟიმში, არასაკმარისი YEAR მნიშვნელობის შეტანა იწვევს შეცდომას.
|
სტრიქონის ტიპები გამოიყენება ტექსტური ინფორმაციის სხვადასხვა სიგრძითა და ფორმატით შესანახად.
სტრიქონული მონაცემთა ტიპებია: CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM და SET.
| ტიპი | მაქს. სიგრძე | აღწერა | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CHAR(M) |
255 სიმბოლო |
ფიქსირებული სიგრძის სტრიქონი.
შენახვისას ივსება მარჯვნიდან ცარიელი ადგილებით (space-ებით),
თუმცა შედარებისას trailing space-ები ხშირად იგნორირდება. მაგალითად, CHAR(30) ინახავს 30 სიმბოლომდე. თუ strict SQL რეჟიმი არ არის ჩართული და CHAR ან VARCHAR სვეტში ჩაწერთ ისეთ მნიშვნელობას, რომელიც აღემატება სვეტის მაქსიმალურ სიგრძეს, მნიშვნელობა შემცირდება (truncated) შესაბამის ზომამდე და გენერირდება გაფრთხილება (warning).
თუ იჭრება არა მხოლოდ space სიმბოლოები, არამედ სხვა სიმბოლოებიც, შეგიძლიათ strict SQL რეჟიმის გამოყენებით გამოიწვიოთ შეცდომა (error) გაფრთხილების ნაცვლად და თავიდან აიცილოთ ასეთი მნიშვნელობის ჩაწერა.
|
|||||||||||||||||||||||||
VARCHAR(M) |
65,535 |
VARCHAR სვეტებში მნიშვნელობები წარმოადგენს ცვლადი სიგრძის სტრიქონებს (variable-length strings). სიგრძე შეიძლება განისაზღვროს 0-დან 65,535-მდე.
თუმცა, VARCHAR-ის ეფექტური მაქსიმალური სიგრძე დამოკიდებულია მაქსიმალური ჩანაწერის (row) ზომაზე (65,535 ბაიტი, რომელიც ნაწილდება ყველა სვეტზე) და გამოყენებულ სიმბოლოთა ნაკრებზე (character set).
|
|||||||||||||||||||||||||
BINARY / VARBINARY |
255 / 65,535 |
BINARY და VARBINARY ტიპები ჰგავს CHAR და VARCHAR ტიპებს, თუმცა ისინი ინახავენ ბინარულ სტრიქონებს და არა ტექსტურ (არაბინარულ) სტრიქონებს. ანუ ისინი ინახავენ ბაიტების მიმდევრობას (byte strings) და არა სიმბოლოების სტრიქონებს. ეს ნიშნავს, რომ მათ აქვთ ბინარული სიმბოლოთა ნაკრები (character set) და კოლაცია (collation), ხოლო შედარება და დალაგება ეფუძნება ბაიტების რიცხვით მნიშვნელობებს.
დასაშვები მაქსიმალური სიგრძე BINARY და VARBINARY ტიპებისთვის იგივეა, რაც CHAR და VARCHAR ტიპებისთვის, თუმცა აქ სიგრძე იზომება ბაიტებში და არა სიმბოლოებში.
BINARY და VARBINARY ტიპები განსხვავდება CHAR BINARY და VARCHAR BINARY ტიპებისგან. ამ უკანასკნელ შემთხვევაში, BINARY ატრიბუტი არ ნიშნავს, რომ სვეტი ბინარულად ინახავს მონაცემებს. ის უბრალოდ აიძულებს ბინარული (_bin) კოლაციის გამოყენებას შესაბამისი სიმბოლოთა ნაკრებისთვის (ან ცხრილის ნაგულისხმევი character set-ისთვის). ასეთ სვეტებში მონაცემები მაინც ინახება როგორც ტექსტური სტრიქონები და არა ბინარული ბაიტები.
|
|||||||||||||||||||||||||
BLOB / TEXT |
— |
BLOB და TEXT ტიპები გამოიყენება დიდი მოცულობის მონაცემების შესანახად. BLOB ინახავს ბინარულ მონაცემებს (ბაიტების მიმდევრობა), ხოლო TEXT — ტექსტურ მონაცემებს (სიმბოლოების სტრიქონი). ორივეს აქვს ოთხი ვარიანტი (TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB), რომლებიც განსხვავდებიან მხოლოდ მაქსიმალური ზომით. BLOB მონაცემები მუშავდება როგორც ბინარული მნიშვნელობები (შედარება ხდება ბაიტების მიხედვით), ხოლო TEXT — character set-ისა და collation-ის მიხედვით. ჩაწერისას padding არ გამოიყენება და მონაცემები უცვლელად ინახება.
თუ მონაცემი აღემატება სვეტის მაქსიმალურ ზომას:
TEXT სვეტებში ზედმეტი თავისუფალი ადგილების (space-ების) მოჭრა ყოველთვის იწვევს გაფრთხილებას. ინდექსირებულ TEXT სვეტებში space-ების გამო შეიძლება დუბლიკატის შეცდომა მოხდეს, ხოლო BLOB-ში - არა.
ძირითადი განსხვავებები VARCHAR / VARBINARY-სთან:
BLOB / TEXT მნიშვნელობები ინახება ცალკე ობიექტებად და მათი მაქსიმალური რეალური ზომა დამოკიდებულია ასევე სისტემის მეხსიერებასა და max_allowed_packet პარამეტრზე.
ზოგადად, BLOB გამოიყენება ბინარული მონაცემებისთვის (მაგ., ფაილები), ხოლო TEXT — ტექსტისთვის, თუმცა პრაქტიკაში ხშირად სჯობს ასეთი მონაცემების დამუშავება აპლიკაციის დონეზე.
|
|||||||||||||||||||||||||
ENUM |
— |
ENUM არის სტრიქონის ტიპი, რომლის მნიშვნელობა ირჩევა წინასწარ განსაზღვრული მნიშვნელობების სიიდან, რომელიც ცხრილის შექმნისას პირდაპირ სვეტის აღწერაში იწერება (მაგ: ENUM('A','B','C')).
მისი უპირატესობებია:
ENUM('Mercury','Venus','Earth') → 'Mercury'=1, 'Venus'=2, 'Earth'=3
numbers ENUM('0','1','2')
თუ ENUM სვეტში შეინახავთ რიცხვს 2, ის აღიქმება როგორც ინდექსი და გადაიქცევა '1'-ად (ინდექსი 2-ის მნიშვნელობა). თუ შეინახავთ '2' (სტრიქონის სახით), ის ემთხვევა ENUM მნიშვნელობას და შეინახება როგორც '2'. თუ შეინახავთ '3', რადგან ასეთი მნიშვნელობა სიაში არ არსებობს, ის აღიქმება როგორც ინდექსი და გადაიქცევა '2'-ად (ინდექსი 3-ის მნიშვნელობა). DEFAULT = პირველი მნიშვნელობა სიაში
ENUM გამოიყენოთ მაშინ, როცა მნიშვნელობების სია მცირე და წინასწარ განსაზღვრულია. მოერიდეთ რიცხვების გამოყენებას მნიშვნელობებად, რათა თავიდან აიცილოთ დაბნეულობა ან მოულოდნელი შედეგები.
|
|||||||||||||||||||||||||
SET |
255 / 65,535 |
SET არის სტრიქონის ტიპი, რომელსაც შეუძლია შეიცავდეს ნულ ან მეტ მნიშვნელობას წინასწარ განსაზღვრული სიიდან (ცხრილის შექმნისას). მნიშვნელობები იწერება მძიმით გამოყოფით, ამიტომ თავად მნიშვნელობებში მძიმე არ უნდა იყოს.
მაგალითად, სვეტს, SET('one', 'two') NOT NULL შეიძლება ჰქონდეს შემდეგი მნიშვნელობები:
თუ რიცხვი ინახება SET სვეტში, მისი ბინარული წარმოდგენის ბიტები განსაზღვრავს, რომელი ელემენტები შევა მნიშვნელობაში. მაგალითად, თუ სვეტი განსაზღვრულია როგორც
SET('a','b','c','d');
მაშინ:
SET ელემენტს, მნიშვნელობა არ აქვს რა თანმიმდევრობით ჩაწერთ მათ. ასევე არ აქვს მნიშვნელობა რამდენჯერ გაიმეორებთ ერთსა და იმავე ელემენტს. მონაცემის ამოღებისას თითოეული ელემენტი გამოჩნდება მხოლოდ ერთხელ და იმ თანმიმდევრობით, როგორც სვეტის განსაზღვრებაშია მითითებული. მაგალითად, თუ სვეტი განსაზღვრულია როგორც:
და ჩაწერთ მნიშვნელობებს 'a,d', 'd,a', 'a,d,a', 'a,d,d', 'd,a,d', საბოლოოდ ყველა მათგანი დაბრუნდება როგორც 'a,d'.
SET სვეტში ჩაწერთ არასწორ მნიშვნელობას, ის იგნორირდება და მიიღებთ გაფრთხილებას, ხოლო strict SQL რეჟიმში - შეცდომას.SET მნიშვნელობები სორტირებულია რიცხვითი მნიშვნელობის მიხედვით. სორტირებისას NULL მნიშვნელობები წინ დგას.SUM() ან AVG(), საჭიროების შემთხვევაში მნიშვნელობას რიცხვად გარდაქმნის. SET-ის შემთხვევაში გამოიყენება მისი რიცხვითი წარმოდგენა.SET მნიშვნელობების მოსაძებნად გამოიყენება:
პირველი პოულობს ზუსტად ელემენტს, ხოლო მეორე - უბრალოდ ტექსტში მის არსებობას (თუნდაც როგორც ქვესტრიქონი). ასევე შესაძლებელია:
პირველი ამოწმებს შეიცავს თუ არა მნიშვნელობა პირველ ელემენტს, ხოლო მეორე - ზუსტ დამთხვევას. შედარებისას ყურადღება მიაქციეთ ელემენტების რიგს — 'val1,val2' და 'val2,val1' განსხვავებულად ითვლება. მნიშვნელობები უნდა მიუთითოთ იმავე რიგით, როგორც სვეტის განსაზღვრებაშია.
SET სვეტის ყველა შესაძლო მნიშვნელობის სანახავად გამოიყენეთ:
SET მნიშვნელობები ბრუნდება როგორც სტრიქონები. |
MySQL უზრუნველყოფს სპეციალიზებულ მონაცემთა ტიპებს, მათ შორის Spatial Data Types და JSON Data Type , რომლებიც გამოიყენება კონკრეტული ტიპის მონაცემების ეფექტურად შესანახად და დასამუშავებლად.
Spatial Data Types განკუთვნილია გეოგრაფიული და გეომეტრიული მონაცემების მოდელირებისთვის. მათი გამოყენება საშუალებას იძლევა შესრულდეს სივრცითი ოპერაციები, როგორიცაა მანძილის გამოთვლა, ობიექტების გადაკვეთის ან მდებარეობის ანალიზი.
JSON Data Type გამოიყენება სტრუქტურირებული მონაცემების JSON ფორმატში შესანახად. იგი უზრუნველყოფს მოქნილ სქემას, ვალიდაციას და ეფექტურ წვდომას მონაცემების ცალკეულ ელემენტებზე, რაც განსაკუთრებით გამოსადეგია დინამიკური და ნახევრადსტრუქტურირებული მონაცემების მართვისას.
დამატებითი დეტალები და გამოყენების მაგალითები ხელმისაწვდომია ზემოთ მითითებულ ოფიციალურ დოკუმენტაციაში.