MySQL მონაცემთა ტიპები

MySQL მსოფლიოში ყველაზე პოპულარული ღია კოდის მქონე მონაცემთა ბაზის მართვის სისტემაა. მონაცემთა ბაზები წარმოადგენს ყველა პროგრამული აპლიკაციისთვის აუცილებელ მონაცემთა საცავებს. მაგალითად, როდესაც ვინმე აკეთებს ვებ ძიებას, შედის საკუთარ ანგარიშში ან ასრულებს ტრანზაქციას, მონაცემთა ბაზა ინახავს ამ ინფორმაციას, რათა მომავალში ის ხელმისაწვდომი იყოს. MySQL ამ ამოცანას ძალიან კარგად ასრულებს.

SQL (Structured Query Language) არის პროგრამირების ენა, რომელიც გამოიყენება მონაცემების სამართავად, რაც გულისხმობს მონაცემების ამოღებას, განახლებას, დამატებასა და წაშლას. MySQL არის SQL-ზე დაფუძნებული რელაციური მონაცემთა ბაზა, რომელიც შექმნილია სტრუქტურირებული მონაცემების შესანახად და სამართავად.

MySQL-ში მონაცემთა ტიპები სამ ძირითად ჯგუფად იყოფა:

რიცხვითი, თარიღი და დრო და სტრიქონის ტიპები.

1. რიცხვითი მონაცემთა ტიპები

MySQL მხარს უჭერს SQL-ის ყველა სტანდარტულ რიცხვით მონაცემთა ტიპს. ეს ტიპები მოიცავს როგორც ზუსტ რიცხვით ტიპებს (INTEGER, SMALLINT, DECIMAL და NUMERIC), ასევე მიახლოებულ, ათწილადური სტილის რიცხვით ტიპებს (FLOAT, REAL და DOUBLE PRECISION). საკვანძო სიტყვა INT წარმოადგენს INTEGER-ის სინონიმს, ხოლო DEC და FIXEDDECIMAL-ის სინონიმებია. 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.

2. თარიღისა და დროის მონაცემთა ტიპები

თარიღისა და დროის მონაცემთა ტიპები, რომლებიც გამოიყენება დროის, თარიღის ან მათი კომბინაციის მნიშვნელობების წარმოსადგენად, არის: 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 ტიპი იღებს მნიშვნელობებს სხვადასხვა ფორმატში:
  • 4-ნიშნა სტრინგები დიაპაზონში '1901'-დან '2155'-მდე.
  • 4-ნიშნა ნუმერული მნიშვნელობები დიაპაზონში 1901–2155.
  • '0'-დან '99'-მდე დიაპაზონში არსებულ ერთნიშნა ან ორნიშნა სტრინგებს MySQL გარდაქმნის:
    • '0'-დან '69'-მდე → 2000–2069
    • '70'-დან '99'-მდე → 1970–1999
  • 0–99 დიაპაზონში არსებულ ერთნიშნა ან ორნიშნა ნუმერულ მნიშვნელობებს MySQL გარდაქმნის:
    • 1–69 → 2001–2069
    • 70–99 → 1970–1999
  • YEAR მნიშვნელობა შეიძლება მივიღოთ ისეთი ფუნქციებისგანაც, რომლებიც აბრუნებენ კორექტულ მნიშვნელობას YEAR კონტექსტში, მაგალითად NOW().
თუ არ არის ჩართული strict SQL რეჟიმი, MySQL არასწორ YEAR მნიშვნელობებს გარდაქმნის 0000-ში. strict SQL რეჟიმში, არასაკმარისი YEAR მნიშვნელობის შეტანა იწვევს შეცდომას.

3. სტრიქონის მონაცემთა ტიპები

სტრიქონის ტიპები გამოიყენება ტექსტური ინფორმაციის სხვადასხვა სიგრძითა და ფორმატით შესანახად. სტრიქონული მონაცემთა ტიპებია: 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).

მნიშვნელობა CHAR(4) საჭირო მეხსიერება VARCHAR(4) საჭირო მეხსიერება
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes
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 არ გამოიყენება და მონაცემები უცვლელად ინახება.
თუ მონაცემი აღემატება სვეტის მაქსიმალურ ზომას:
  • strict რეჟიმის გარეშე - იჭრება და გენერირდება გაფრთხილება
  • strict რეჟიმში - ხდება შეცდომა და ჩაწერა ვერ ხერხდება
TEXT სვეტებში ზედმეტი თავისუფალი ადგილების (space-ების) მოჭრა ყოველთვის იწვევს გაფრთხილებას. ინდექსირებულ TEXT სვეტებში space-ების გამო შეიძლება დუბლიკატის შეცდომა მოხდეს, ხოლო BLOB-ში - არა.
ძირითადი განსხვავებები VARCHAR / VARBINARY-სთან:
  • აუცილებელია ინდექსის prefix-ის მითითება
  • DEFAULT მნიშვნელობა არ აქვთ
  • TEXT-ზე BINARY ნიშნავს _bin collation-ს
დიდი ზომის გამო:
  • დალაგებისას გამოიყენება მხოლოდ პირველი max_sort_length ბაიტები
  • დროებითი ცხრილები შეიძლება დისკზე შეიქმნას (რაც ანელებს შესრულებას)
BLOB / TEXT მნიშვნელობები ინახება ცალკე ობიექტებად და მათი მაქსიმალური რეალური ზომა დამოკიდებულია ასევე სისტემის მეხსიერებასა და max_allowed_packet პარამეტრზე.
ზოგადად, BLOB გამოიყენება ბინარული მონაცემებისთვის (მაგ., ფაილები), ხოლო TEXT — ტექსტისთვის, თუმცა პრაქტიკაში ხშირად სჯობს ასეთი მონაცემების დამუშავება აპლიკაციის დონეზე.
ENUM ENUM არის სტრიქონის ტიპი, რომლის მნიშვნელობა ირჩევა წინასწარ განსაზღვრული მნიშვნელობების სიიდან, რომელიც ცხრილის შექმნისას პირდაპირ სვეტის აღწერაში იწერება (მაგ: ENUM('A','B','C')). მისი უპირატესობებია:
  • კომპაქტური შენახვა - მნიშვნელობები შიდა დონეზე რიცხვებად ინახება
  • ადვილად წასაკითხი შედეგები - რიცხვები ავტომატურად გარდაიქმნება შესაბამის სტრიქონებად
პოტენციური პრობლემები:
  • რიცხვების მსგავსი მნიშვნელობები შეიძლება აგერიოთ მათ შიდა ინდექსებთან
  • ORDER BY გამოყენებისას საჭიროა სიფრთხილე
  • ENUM სვეტების შექმნა და გამოყენება
    • ENUM მნიშვნელობა უნდა იყოს ბრჭყალებში მოქცეული სტრიქონი.
    • თუ ცხრილში ჩავამატებთ 1 მილიონ ჩანაწერს მნიშვნელობით 'medium', საჭირო იქნება მხოლოდ 1 მილიონი ბაიტი მეხსიერება. შედარებისთვის, თუ იმავე მნიშვნელობას ('medium') შევინახავდით VARCHAR სვეტში როგორც სრული სტრიქონი, დასჭირდებოდა დაახლოებით 6 მილიონი ბაიტი.
  • ინდექსები ENUM-ში
    • თითოეულ მნიშვნელობას აქვს ინდექსი (იწყება 1-დან)
    • '' (ცარიელი სტრიქონი) → ინდექსი 0
    • NULL → ინდექსი NULL
    • მაგალითად: ENUM('Mercury','Venus','Earth') → 'Mercury'=1, 'Venus'=2, 'Earth'=3

      მნიშვნელობა ინდექსი
      NULL NULL
      '' 0
      'Mercury' 1
      'Venus' 2
      'Earth' 3
    • მაქსიმუმ 65,535 უნიკალური მნიშვნელობის ქონაა შესაძლებელი.
    • თუ ENUM მნიშვნელობას გამოიყენებთ რიცხვით კონტექსტში, დაბრუნდება მისი ინდექსი (არა ტექსტური მნიშვნელობა).
      მაგალითად: SELECT enum_col+0 FROM tbl_name;
      ასევე, ისეთი ფუნქციები, როგორიცაა SUM() ან AVG(), საჭიროების შემთხვევაში მნიშვნელობას გარდაქმნიან რიცხვად - ENUM-ის შემთხვევაში კი გამოიყენება მისი ინდექსი გამოთვლებში.
  • მნიშვნელობების დამუშავება
    • trailing space-ები ავტომატურად იშლება
    • შენახული მნიშვნელობა დაბრუნდება იმ ფორმით (lettercase), როგორც სვეტის განსაზღვრისას იყო მითითებული
    • თუ ENUM-ში შეინახავთ რიცხვს, ის შეიძლება აღქმულ იქნას როგორც ინდექსი
    • მაგალითად: numbers ENUM('0','1','2')
      თუ ENUM სვეტში შეინახავთ რიცხვს 2, ის აღიქმება როგორც ინდექსი და გადაიქცევა '1'-ად (ინდექსი 2-ის მნიშვნელობა). თუ შეინახავთ '2' (სტრიქონის სახით), ის ემთხვევა ENUM მნიშვნელობას და შეინახება როგორც '2'. თუ შეინახავთ '3', რადგან ასეთი მნიშვნელობა სიაში არ არსებობს, ის აღიქმება როგორც ინდექსი და გადაიქცევა '2'-ად (ინდექსი 3-ის მნიშვნელობა).
  • ცარიელი და NULL მნიშვნელობები
    • არასწორი მნიშვნელობა → '' ანუ ცარიელი მნიშვნელობა (ინდექსი 0), ხოლო strict რეჟიმში - შეცდომა
    • თუ სვეტი nullable-ია → DEFAULT = NULL
    • თუ სვეტი არ არის nullable → DEFAULT = პირველი მნიშვნელობა სიაში
  • სორტირება
    • ENUM-ის სორტირება ხდება ინდექსების მიხედვით (არა ალფაბეტურად)
    • სორტირებისას, '' (ცარიელი მნიშვნელობა) ტექსტზე წინ მოდის, ხოლო NULL - ყველაზე წინ
    • რეკომენდებულია ENUM სიის ალფაბეტურად დალაგება, რათა თავიდან აიცილოთ მოულოდნელი შედეგები
  • შეზღუდვები
    • ENUM მნიშვნელობა არ შეიძლება იყოს expression (მაგალითად:
      ENUM('small', CONCAT('med','ium'), 'large'))
    • არ შეიძლება user variable-ის გამოყენება
    • დუბლიკატები იწვევს warning-ს, ხოლო strict რეჟიმში - error-ს
რეკომენდებულია ENUM გამოიყენოთ მაშინ, როცა მნიშვნელობების სია მცირე და წინასწარ განსაზღვრულია. მოერიდეთ რიცხვების გამოყენებას მნიშვნელობებად, რათა თავიდან აიცილოთ დაბნეულობა ან მოულოდნელი შედეგები.
SET 255 / 65,535 SET არის სტრიქონის ტიპი, რომელსაც შეუძლია შეიცავდეს ნულ ან მეტ მნიშვნელობას წინასწარ განსაზღვრული სიიდან (ცხრილის შექმნისას). მნიშვნელობები იწერება მძიმით გამოყოფით, ამიტომ თავად მნიშვნელობებში მძიმე არ უნდა იყოს.
მაგალითად, სვეტს, SET('one', 'two') NOT NULL შეიძლება ჰქონდეს შემდეგი მნიშვნელობები:
  • ''
  • 'one'
  • 'two'
  • 'one,two'
მისი ძირითადი მახასიათებლებია:
  • შეიძლება ჰქონდეს მაქსიმუმ 64 სხვადასხვა მნიშვნელობა
  • დუბლირებული მნიშვნელობები განსაზღვრებაში იწვევს გაფრთხილებას (warning), ხოლო strict SQL რეჟიმში - შეცდომას (error).
  • ცხრილის შექმნისას SET ელემენტების მნიშვნელობებიდან ბოლოში არსებული გამოტოვებები (trailing spaces) ავტომატურად იშლება.
  • მონაცემების ამოღებისას, SET სვეტში შენახული მნიშვნელობები ბრუნდება იმავე ასოების ზომით (lettercase), რაც სვეტის განსაზღვრებაში იყო გამოყენებული. SET სვეტებს შეიძლება ჰქონდეთ მინიჭებული character set და collation. ბინარული ან case-sensitive collation-ის შემთხვევაში, მნიშვნელობის მინიჭებისას ასოების ზომას მნიშვნელობა აქვს.
  • MySQL SET მნიშვნელობებს ინახავს რიცხვითად, სადაც შენახული მნიშვნელობის ყველაზე დაბალი ბიტი შეესაბამება პირველ ელემენტს. თუ SET მნიშვნელობას რიცხვით კონტექსტში გამოითხოვთ, დაბრუნებული მნიშვნელობა წარმოადგენს იმ ბიტების ერთობლიობას, რომლებიც შეესაბამება სვეტში არსებულ ელემენტებს.
  • მაგალითად:
    SELECT set_col+0 FROM tbl_name;
                                
    თუ რიცხვი ინახება SET სვეტში, მისი ბინარული წარმოდგენის ბიტები განსაზღვრავს, რომელი ელემენტები შევა მნიშვნელობაში. მაგალითად, თუ სვეტი განსაზღვრულია როგორც SET('a','b','c','d'); მაშინ:

    SET წევრი ათობითი მნიშვნელობა ბინარული მნიშვნელობა
    'a' 1 0001
    'b' 2 0010
    'c' 4 0100
    'd' 8 1000
    თუ ამ სვეტს მიანიჭებთ მნიშვნელობას 9 (რაც ბინარულად არის 1001), აირჩევა პირველი და მეოთხე ელემენტი - 'a,d'.
  • თუ მნიშვნელობა შეიცავს ერთზე მეტ SET ელემენტს, მნიშვნელობა არ აქვს რა თანმიმდევრობით ჩაწერთ მათ. ასევე არ აქვს მნიშვნელობა რამდენჯერ გაიმეორებთ ერთსა და იმავე ელემენტს. მონაცემის ამოღებისას თითოეული ელემენტი გამოჩნდება მხოლოდ ერთხელ და იმ თანმიმდევრობით, როგორც სვეტის განსაზღვრებაშია მითითებული. მაგალითად, თუ სვეტი განსაზღვრულია როგორც:
  • CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                                    
    და ჩაწერთ მნიშვნელობებს 'a,d', 'd,a', 'a,d,a', 'a,d,d', 'd,a,d', საბოლოოდ ყველა მათგანი დაბრუნდება როგორც 'a,d'.
  • თუ SET სვეტში ჩაწერთ არასწორ მნიშვნელობას, ის იგნორირდება და მიიღებთ გაფრთხილებას, ხოლო strict SQL რეჟიმში - შეცდომას.
  • SET მნიშვნელობები სორტირებულია რიცხვითი მნიშვნელობის მიხედვით. სორტირებისას NULL მნიშვნელობები წინ დგას.
  • ფუნქციები, როგორიცაა SUM() ან AVG(), საჭიროების შემთხვევაში მნიშვნელობას რიცხვად გარდაქმნის. SET-ის შემთხვევაში გამოიყენება მისი რიცხვითი წარმოდგენა.
  • ჩვეულებრივ, SET მნიშვნელობების მოსაძებნად გამოიყენება:
  • SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
    SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
                                
    პირველი პოულობს ზუსტად ელემენტს, ხოლო მეორე - უბრალოდ ტექსტში მის არსებობას (თუნდაც როგორც ქვესტრიქონი). ასევე შესაძლებელია:
    SELECT * FROM tbl_name WHERE set_col & 1;
    SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
                                
    პირველი ამოწმებს შეიცავს თუ არა მნიშვნელობა პირველ ელემენტს, ხოლო მეორე - ზუსტ დამთხვევას. შედარებისას ყურადღება მიაქციეთ ელემენტების რიგს — 'val1,val2' და 'val2,val1' განსხვავებულად ითვლება. მნიშვნელობები უნდა მიუთითოთ იმავე რიგით, როგორც სვეტის განსაზღვრებაშია.
  • SET სვეტის ყველა შესაძლო მნიშვნელობის სანახავად გამოიყენეთ:
  • SHOW COLUMNS FROM tbl_name LIKE set_col;
                                
  • C API-ში SET მნიშვნელობები ბრუნდება როგორც სტრიქონები.

MySQL უზრუნველყოფს სპეციალიზებულ მონაცემთა ტიპებს, მათ შორის Spatial Data Types და JSON Data Type , რომლებიც გამოიყენება კონკრეტული ტიპის მონაცემების ეფექტურად შესანახად და დასამუშავებლად.

Spatial Data Types განკუთვნილია გეოგრაფიული და გეომეტრიული მონაცემების მოდელირებისთვის. მათი გამოყენება საშუალებას იძლევა შესრულდეს სივრცითი ოპერაციები, როგორიცაა მანძილის გამოთვლა, ობიექტების გადაკვეთის ან მდებარეობის ანალიზი.

JSON Data Type გამოიყენება სტრუქტურირებული მონაცემების JSON ფორმატში შესანახად. იგი უზრუნველყოფს მოქნილ სქემას, ვალიდაციას და ეფექტურ წვდომას მონაცემების ცალკეულ ელემენტებზე, რაც განსაკუთრებით გამოსადეგია დინამიკური და ნახევრადსტრუქტურირებული მონაცემების მართვისას.

დამატებითი დეტალები და გამოყენების მაგალითები ხელმისაწვდომია ზემოთ მითითებულ ოფიციალურ დოკუმენტაციაში.