Əsas səhifə > MySQL > MySQL-də SQL_MODE əhəmiyyəti

MySQL-də SQL_MODE əhəmiyyəti

MySQL-in bir çox xarakteristikalarını SQL_MODE vasitəsilə dəyişmək mümkündür. Bu xüsusən database üçün düzgün input qaydalarını müəyyən etmək üçün əhəmiyyətlidir.
Məsələn default olaraq MySQL “division by zero” (0-a bölmə) olduqda NULL daxil edir. Lakin təbii ki , bizə bu zaman ERROR verməsi daha çox sərf edər.
Və.s bu kimi xüsusiyyətləri SQL_MODE ilə idarə etmək olar.
İlk öncə default SQL_MODE-un nə olduğunu öyrənək:

select @@sql_mode;

default sql_mode

CREATE TABLE t2 (
id INT(11),
name VARCHAR(4)
);

Və insert etdikdə STRICT_TRANS_TABLES-ın əməlləri olaraq ERROR alırıq.Çox sağolsun🙂
Bu mode aktiv edildikdə əmin ola bilərik ki, “out of range” məlumat daxil edilməyəcək.

mysql> insert into t2 values(15,'Besiktas');
ERROR 1406 (22001): Data too long for column 'name' at row 1

NO_AUTO_CREATE_USER—bu da çox əhəmiyyətli bir mode-dur.
Deyək ki siz bilmədən mövcud olmayan bir user-ə GRANT verirsiz. Əgər bu mode aktiv deyilsə, GRANT icazəsiz olaraq yeni bir user yaradacaq. Bu mode aktiv olsa, ERROR çıxar və bunun qarşısını alacaq.
Göstərmək məqsədilə SQL_MODE-u dəyişək.

set @@global.sql_mode=ANSI;

Reconnect olaq və

select @@sql_mode;

Gördüyümüz kimi NO_AUTO_CREATE_USER mode-u burda yoxdur. Bu səbəbdəndir ki,

GRANT SELECT ON tr_blog.military TO 'jeffrey'@'localhost'; 

komandası işləyəcək və həqiqətən də yeni user yaradılacaq.

select user from mysql.user;

NO_ENGINE_SUBSTITUTION— deyək ki biz elə bir table yaratmaq istəyirik ki, hər hansı dəstəklənməyən storage engine-dan istifadə etsin (məsələn NDB). Təbii ki , əgər bu mode aktiv olmasa default engine istifadə olunacaq amma məncə ERROR çıxsa daha gözəl olar🙂

create table t3 (id int) engine=NDB;

STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION— bu 3 mode default olaraq MySQL installation-da yer alır.
Lakin bəzən bu default hallar bizə bəs etmir. Məsələn default olaraq “division by zero” əməliyyatı zamanı NULL insert və ya update olunur(mövzunun əvvəlində qeyd olunduğu kimi).

CREATE TABLE t1 (
id INT not null
);
insert into t1 values(1/0);

Adətən isə bizə bu sərf etmir. Yəni programlaşdırmadan belə görmüşük ki bu zaman ERROR çıxmalıdır özü də dəhşət məşhur bir ERROR🙂
Və MySQL-in dəstəklədiyi ən ciddi mode “TRADİTİONAL”-dır ki, bu indiki halda bizə lazım olandır.

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

mysql> select @@session.sql_mode\G
*************************** 1. row ***************************
@@session.sql_mode: STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

İndi isə yenidən insert verək:

insert into t1 values(1/0);

Və sevimli ERROR-umuz bu zaman gəlir🙂
TRADİTİONAL mode bizə Bir çox əlavə restriction-lar verir. Daha ətraflı documentation-dan oxumaq olar.

MySQL Server SQL Modes

Kateqoriyalar: MySQL Etiketlə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: