Əsas səhifə > MySQL > SQL_MODE ilə invalid data handling

SQL_MODE ilə invalid data handling

İndiki mövzumuz data tiplərin minimum və maximum value və.s , həmçinin data type conversion dediyimiz bir şey haqqındadır. Söhbətimiz İNT və Varchar tipləri üzərində gedəcək.

Söhbətimizi əyani olaraq davam etdirək. Table yaradaq:

CREATE TABLE students (
    Stud_ID int(3) NOT NULL,
    Stud_Name VARCHAR(25) NOT NULL,
    Stud_Phone VARCHAR(5) NOT NULL,
    Stud_Address VARCHAR(50)
);

Qeyd edək ki, biz non-strict sql mode-unda işləyirik.
(MySQL-də SQL_MODE əhəmiyyəti)

set sql_mode='';

Daha sonra da insert-lər verək:

mysql> insert into students() values(1,'Orxan','0554962101','Yeni Yasamal');
Query OK, 1 row affected, 1 warning (0.11 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1265 | Data truncated for column 'Stud_Phone' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)

Gördüyümüz kimi, varchar(5) olan sütuna uzunluğu 10 olan bir məlumat daxil etdikdə o 5-ə truncate olunur.
select

Davam edək indi int-ə(stud_id) daha uzun bir məlumat daxil edək:

mysql> insert into students() values(444444,'Elvin','05567','Sovetski');
Query OK, 1 row affected (0.11 sec)

Nə error nə də ki bir Warning var və məlumat öz qaydasında daxil edilir:
select2

Demək ki, int(3) yazılsa da 3-də daha uzun bir rəqəm ora daxil edilə bilərmiş.
indi isə int-ə hər hansı bir string, varchar-a isə hər hansı bir rəqəm daxil edək:

mysql> insert into students() values('Mahmud',12345,'05078','Iceriseher');
Query OK, 1 row affected, 1 warning (0.11 sec)

stud_id int-dir ora ‘Mahmud’,stud_name varchar-dır ora 12345 daxil edirik.və nəticədə Warning görürük.
warnings

insert

Yuxarıdan aydın olur ki,non-strict sql_mode-da, int tipli column-a string insert etmək istədikdə MySQL həmin string-in yerinə 0 daxil edir!. Amma varchar tipli column-a integer daxil etdikdə onu olduğu kimi daxil edir. Demək ki, kimsə səhv edib tipləri qarışdırsa ağzına gələni daxil edəcək🙂 bir daha deyirəm bu non-strict sql_mode-da belədir

İndi isə column definition-larda data type-ların özlərini dəyişək. Yəni table içində düzgün məlumatlar ola-ola int->varchar, varchar->int conversion edək. Təsəvvür edək ki, aşağıdakı məlumatlar var:

mysql> select * from students;
+---------+-----------+------------+--------------+
| Stud_ID | Stud_Name | Stud_Phone | Stud_Address |
+---------+-----------+------------+--------------+
|       1 | Orxan     | 05549      | Yeni Yasamal |
|  444444 | Elvin     | 05567      | Sovetski     |
|       2 | Mahmud    | 05078      | Iceriseher   |
+---------+-----------+------------+--------------+
3 rows in set (0.00 sec)

stud_id-nin data tipini varchar edək:

mysql> alter table students modify stud_id varchar(3) not null;
Query OK, 3 rows affected, 1 warning (0.32 sec)
Records: 3  Duplicates: 0  Warnings: 1

warning-ə baxaq və select verək:
select5

Yaxşı bayaqdan int-ə string gedir, data truncate olur və.s…Aləm dəyib bir-birinə🙂 Bunun qarşısını alacaq bir şey yoxdur mu? Yəni ən azından əgər data truncate olacaqsa bir ERROR çıxsın ortaya…Məsələn, yuxarıdakı kimi int-ə string insert etmək istədikdə 0 daxil etməsin onun əvəzinə ERROR versin ki, işimizi bilək…
Adətən bu cür check-ləri PHP-də edirlər mən bilən. Data İnput Handling(error handling) deyilir səhv etmirəmsə buna. Mən bütün PHP programmer-ləri bu işi MySQL-in üstünə atmağa dəvət edirəm.🙂
Cox sadə yolu var…STRİCT sql_mode. Bayaqkı bütün nümunələrimiz non-strict sql_mode-da çalışmışdı indi isə STRİCT-də işlədək. Yəni sql_mode-u dəyişək:

mysql> set sql_mode='traditional';
Query OK, 0 rows affected (0.00 sec)

Və indi də bayaqdan yazdıqlarımızı bir daha yazmağa çalışaq…
varchar(5) olan sütuna uzunluğu 10 olan bir məlumat daxil etdikdə:

mysql> insert into students() values(1,'Orxan','0554962101','Yeni Yasamal');
ERROR 1406 (22001): Data too long for column 'Stud_Phone' at row 1

Bəh bəh nə gözəl bir ERROR…

Daha sonra , int-ə hər hansı bir string, varchar-a isə hər hansı bir rəqəm daxil etdikdə:

mysql> insert into students() values('Mahmud',12345,'05078','Iceriseher');
ERROR 1366 (HY000): Incorrect integer value: 'Mahmud' for column 'stud_id' at r

Yenə bəh bəh…🙂

Gördüyümüz kimi strict sql_mode-u enable etməklə biz təminat alırıq ki, int tipli column-da yalnız integer olacaq və həmçinin də hər hansı varchar(5) olan column-a yalnız 5 simvollu string daxil ediləcək…Əgər belə olmazsa ERROR alacıq.
Hər kəsi sql_mode-a daha çox fikir verməyə çağırıram, çünki bir çoxu işləri yüngülləşdirir.

SQL_MODE haqqında daha ətraflı :
MySQL-də SQL_MODE əhəmiyyəti

Təşəkkürlər…

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: