ltrim ve rtrim
ltrim('değer', 'budanacek değer')
rtrim : ltrim ile aynı işlemi karakter katarının sağında yapar
MOD
MOD(d1 ,d2) : d1 'in d2'ye bölümü sonucu oluşan kalan değerini döndürür.
MONTHS_BETWEEN
MONTHS_BETWEEN(tarih1,tarih2) : Iki tarih arasında kaç ay olduğunu hesaplar. Eğer tarih2 tarih1 'den daha büyükse sonuç negatif olarak üretilir.
MySQL Administrator
* MySQL veritabanı sunucusunun yönetimi ve bakımı için bir grafik arayüz.
* Komut satırından yapabileceğiniz tüm işlemleri görsel bir ortamda sunar.
* Kullanıcı yönetimi
* MySQL sunucusunun dinamik olarak sağlık :-) durumunun izlenebilmesi
* Yedekleme ve yedeklerden geri yükleme
* Sunucu kayıtlarının (log) incelenmesi
* Sunucunun optimizasyonu
* Sunucuda yer alan tüm veritabanı ve tabloların incelenmesi ve optimize edilebilmesi
* Hem Linux hem Windows sürümleri bulunuyor.
Mysql db random veri almak
$mysql = mysql_query("select * from table ORDER BT rand() DESC LIMIT 10");
while($w = mysql_fetch_array($mysql)) {
echo "".$w['kolonadi']."
";
}
MySQL güvenliği
1-Tüm mySQL hesapları şifreli olmalı. Aksi taktirde mysql -u divran divran_db gibi bir komutla mysql sunucuya kolayca bağlanabilir
2-mySQL sunucusunu root kullanıcısı ile asla çalıştırmayın.File yetkisine sahip herhargi bir kullanıcının root olarak bir dosya oluşturmasına sabep olabileceği için bu çok tehlikeli bir durumdur (Örn: ~root/.bashrc). Bunu engellemek için
açıkça --user=root komutu kullanılmadıkça mySQL in root olarak komut çalıştırmasını reddedin.
mySQL,sıradan , yetkisiz kullanıcı yerine çalıştırılabilir.Her şeyi daha güvenli yapabilmek için ayrı bir mySQL isimli Unix hesabı oluşturabilirsiniz.Bu hesabı başka bir Unix kullanıcısı olarak mySQL yönetiminde mysqld başlatmak için
kullanın,Sunucu seçeneklerini belirtiğiniz my.cnf dosyasındaki [mysqld] gurubu başlığı altına bir kullanıcı USER (kullanıcı) ekleyin örnek
[mysqld]
user=mysql
Bu, sizin elle belirlediğiniz kullanıcını sunuc tarafından başlatılmasına sebeb olur.Root dan başka mysqld nin Unix kullanıcısı olarak çalıştırılması Kullanıcı tablosundaki root kullanıcı isminin değiştirlmesi gerektiği anlamına gelmez
3-Sembolik Linkerin tablolarda kullanılmasına izin vermeyin. (Bu seçenek --skip-symbolic-links komutu ile iptal edilir) Bu özellikle mysqld yi root olarak çalıştırıyorsanız önemlidir. Çünkü sunucuda yazma yetkisi olan herhangi bir kimse sistemdeki herhangi bir dosay yı silebilir
4-Unix sunucularda Yazma ve Okuma yetkileri olan kullanıcıların mysqld olarak işlem yaptığına emin olun
5-Yönetici olmayan kimselere Proccess veya Super yetkilerini vermeyin. mysqladmin processlist ve SHOW PROCESSLIST çıktısı yürütülen komutları metin olarak gösterir.Sunucu işlem listesini görme yetkisi olan bazı kullanıcılar diğer kullanıcların verdiği komutlrın listesini görebilir (örn : UPDATE user SET password=PASSWORD('not_secure')
mysqld, Super yetkisi olan kullanıcılar için extra bağlantı saklar.Tüm normal bağlantılar kullanımda olsa bile mySQL root kullanıcısı giriş yapabilri ve sunucu işlemlerini kontrol edebilir.Super yetkisi istemci bağlantısını kesmek,sistem değişken değerleri ve kopya sunucularını kontrol etmek için kullanılır
6-File yetkisini yönetici olmayanlara vermeyin Bu yetkiye sahip herhangi bir kullanıcı dosya sistemindeki mysqld yetkileri ile herhangi bir yerde dosya oluşturabilir.Bir nebze güvenlik için SELECT ... INTO OUTFILE komutu ile üretilmiş dosyalar var olan dosya üzerine yazmazlar ve herkes tarafından yazılabilir durumdalar.
File yetkisi herhangi bir dosyayı okumak için kullanılabilir.Bu yetki ile veritabnındaki tabloar okunabilir.Bu durum tehlikeli bi durum örn: bir tablo içine /etc/passwd yüklemek için LOAD DATA kullanılabilir
8-Eğer DNS e güvenmiyorsanız tablolarda Hostname yerine IP kullanın.Her halukarda wildcard içeren hostname değeri kullanarak büyük tablo oluşturma işleminde dikkatli olun
9-Bir hesaba izin verilen bağlantı sayısını sınırlandırmak için mysqld de max_user_connections değişkenini kullanın.GRANT cümlesi kaynak kontrolunu destekler
10- --ssl ile başlayan bağlantı dizeleri kullanın
MySQL için Güvenlik Önerileri
* Root kullanıcısına bir şifre tanımladığınıza emin olun, MySQL standart kurulumunda size root kullanıcısına bir şifre vermenizi söyler ama buna sizi zorlamaz.
* MySQL sunucusunu root olarak çalıştırmayın.
* Eğer MySQL'le sadece kendi çalıştığı sunucudan bir program bağlantı kuracaksa (çoğu web-veritabanı uygulamasında olduğu gibi), TCP/IP servisini kapatın (--skip-networking). Aynı bilgisayardaki web sunucu MySQL'e bağlanmak için zaten çok daha hızlı olan unix soketlerini kullanacaktır.
* MySQL'in sembolik linklenmiş tabloları kullanmasına izin vermeyin (--skip-symlink seçeneği).
* Tek bir kullanıcının kurabileceği en fazla bağlantı sayısını mysqld'nin max_user_connections seçeneği ile ayarlayabilirsiniz. Böylece bir kullanıcı herhangi bir nedenle çok fazla bağlantı açtığında (programındaki bir hata veya saldırı amacıyla), MySQL zor durumda kalmayacaktır.
* "process" yetkisini kullanıcılara vermeyin. Kendi halinde bir kullanıcının veritabanının o anda yaptığı sorguların neler olduğuna öğrenmeye ihtiyacı olmaması gerekir.
* "file" yetkisini kullanıcılara vermeyin. Aksi takdirde MySQL kullanıcısının hakları ile sunucunuzdaki diledikleri yere yazabilir ve okuyabilirler.
* MySQL sunucunuzun kullandığı DNS'in yanıltılması olasılığına karşı; erişim kısıtlamaları tanımlarken, bilgisayar ismi yerine IP numarası kullanabilirsiniz. O zaman MySQL'i --skip-name-resolve seçeneği ile çalıştırarak sadece IP numaraları ile çalışmasını ve hiç DNS kullanmamasını sağlayabilirsiniz.
* Veritabanı dosyalarının bulunduğu dizine (orn. /usr/local/mysql/var) sadece mysql kullanıcısının okuma/yazma hakkı olduğundan emin olun.
* MySQL'i sakın --skip-grant-tables seçeneği ile çalıştırmayın. Bu, MySQL'in yetkilendirme sistemini iptal ederek çalışmasına ve tüm kullanıcıların veritabanlarına tam erişime sahip olmasına yol açar.
MySQL ile Veri Tabanı Yönetimi
Burada UNIX sistemi üzerinde MySQL'in kurulup yönetilmesi üzerinde durulacaktır. MySQL derlendikten sonra ilk yapılması gereken 'mysql' adlı veri tabanının server üzerine kurmaktır. Bu veri tabanı, server üzerindeki diğer veri tabanlarına erişim haklarını oldukça ayrıntılı bir şekilde tablolarında tutmaktadır.
Bu veri tabanının yaratılması için öncelikle root olarak login olunur ve aşağıdaki komutlar işletilir:
>cd /bin
>./mysql_install_db
Böylece tüm verılerın tutulacagı '/var' dızını de yaratılmış olur.
Artık veri tabanı sunucusu arka planda çalıştırılabilir:
>./safe_mysqld &
MySQL standart olarak 3306 numaralı portta çalışmaktadır.
Veri tabanı üzerinde her hakka sahip kullanıcı, aynı zamanda sistemin 'root'udur. şu anda root, MySQL sunucusuna şifresiz bağlanabilir. Güvenlik için bu süper kullanıcıya veri tabanına erişim şifresi verilmesi gerekir:
>./mysqladmin -u root -password '<şifre>'
Daha sonra bu şifre kullanılarak sunucuya bağlanılabilir:
>./mysql -u root -p
>Enter passwd: <şifre>
Böylece istemci programımız sunucuya bir oturum başlatmış olur. Artık karşımıza çıkan komut satırından SQL komutlarını uygulayabiliriz:
Burada SQL standardına uyan data definition (create table ..., alter table ..., drop table ..., vs...) ve data manipulation (select ..., insert ..., update ..., vs...) komutları kullanılabilir.
MySQL KURULUMU
Kaynak kodlarından Türkçe sıraya dizme desteği ile derlemek için,
* tar -zxf /root/mysql-4.0.22.tar.gz
cd mysql-4.0.22
./configure --prefix=/usr/local/mysql --with-charset=latin5
make
make install
cp /usr/local/mysql/share/mysql/mysql.server /usr/local/mysql/bin
/usr/local/mysql/bin/mysql_install_db
groupadd mysql
useradd -g mysql mysql
chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql
/usr/local/mysql/bin/mysql.server start
cd ..
rm -rf mysql-4.0.22
MySQL Log Dosyaları
* Error Log : MySQL sunucusu başlatılırken, durdurulurken ya da çalışırken oluşan hata kayıtları (makinaismi.err)
* Query Log : Sunucuya yapılan tüm bağlantıların ve uygulanan sorguların kayıtları (makinaismi.log)
* Binary Log : Veritabanında tutulan bilgilerde değişiklik yapan tüm sorguların kayıtları -- replikasyon için de kullanılır (makinaismi-bin*)
* Slow Log : Belirli bir süreden daha uzun süren ve/ya indeks kullanmayan sorguların kayıtları (makinaismi-slow.log)
* Ayrıntılı bilgi :
MySQL Programlama için Performans İpuçları
* Sorguda LIKE '%string%' gibi bir ifade kullanıldığında, eğer string 3 karakterden daha uzun ise, MySQL özel bir algoritma kullanarak daha hızlı arama yapar.
* Tablolar üzerinde yaptığınız sorguların, yaptığınız indeksleri kullandığına emin olun. EXPLAIN komutuyla yaptığınız herhangi bir SELECT sorgusu ile ilgili ayrıntılı bilgi alabilirsiniz.
* Sık güncellenen MyISAM tablolarında tablo kitleme problemlerinden kaçınmak için karmaşık SELECT sorguları kullanmamaya özen gösterin.
* Çok güncelleme yapılan tablolarda, VARCHAR ve BLOB/TEXT dinamik boylu veri tipleri kullanılmazsa performans artışı sağlanır.
* Bir tablodaki satırların sıralamasını ALTER TABLE komutuyla değiştirebilirsiniz. Eğer bir tablodan sürekli belirli bir sıraya göre veri alıyorsanız, özellikle büyük güncellemelerden sonra tablodaki satırları uygun biçimde sıralamak performansı arttıracaktır.
* Alanların öntanımlı değerleri olmasının avantajını kullanın. Gireceğiniz veri öntanımlı değerle aynı ise, özel olarak belirtmenize gerek yoktur. Böylece MySQL daha az veri ayrıştıracak (parse) ve veriyi daha hızlı veritabanına girecektir.
* Web üzerinden yazılım geliştirirken, resimleri veritabanında tutmak yerine resim dosyası olarak dosya sisteminde tutup, veritabanına sadece resmin nerede olduğunun bilgisini yerleştirmeyi tercih edin. Bir web sunucusu dosya cache'leme konusunda, veritabanı bilgisi cache'lemekten daha başarılıdır. MySQL'in resim üzerinde arama yapma ve benzeri özellikleri olmadığından, pratikte resmi veritabanında saklamanızın da bir anlamı yoktur.
MySQL Query Browser
* SQL sorgularınızı kolayca oluşturmak, uygulamak ve analiz etmek için bir görsel araç.
* SQL sorgularınızı görsel araçların yanı sıra elle kodlayarak da oluşturabilirsiniz.
* Sorgu tarihçesi sayesinde daha önce yaptığınız sorgulara kolaylıkla ulaşabilirsiniz.
* Birden fazla sorgu sonucuna farklı sekmelerden (tab) ulaşabilir ve onları karşılaştırabilirsiniz.
* Sorgu sonuçlarını bir hesap tablosunun hücreleri gibi düzenleyebilirsiniz.
* Veritabanlarınızda yer alan tabloları oluşturabilir, değiştirebilir ve silebilirsiniz.
* Seçilen nesneler, parametreler ve fonksiyonlar için ayrıntılı yardım bölümleri bulunuyor.
* Hem Linux hem Windows sürümleri bulunuyor.
MySQL Sunucu için Performans İpuçları
* MySQL'in hangi opsiyonlar ile çalışmakta olduğu SHOW VARIABLES komutu ile görülebilir.
* MySQL'in optimizasyon ayarları my.cnf dosyasından yapılıyor. Örnek ayar dosyaları mevcut.
* my-huge.cnf -- bellek = 1-2 GB
* my-large.cnf -- bellek = 512 MB
* my-medium.cnf -- bellek = 128 MB
* my-small.cnf -- bellek < 64 MB
* Unix soketleri yerine TCP/IP üzerinden bağlanılırsa %7.5 daha yavaş çalışır
* İstemci ile sunucunun farklı bilgisayarlarda olması durumunda, 100 mbit ethernet bağlantılarında bile %8-11 daha yavaş bağlanılır
* MySQL, kurulum sırasında statik yerine dinamik derlenmiş ise %13 daha yavaş çalışır
* Diske verilerin SSL ile şifrelenmiş olarak yazılması %55 performans kaybına yol açar
Mysql Tablo Karakter Seti Değiştirme
Bir tablo içerisindeki tüm elemanların ve tablonun karakter setini değiştirmek için:
ALTER TABLE `tablo` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
sql kodunu kullanabilirsiniz(Ben utf8 e ayarlamaya çalıştım).
Mysql Veri Türleri
MySQL'de bir çok veri türü oluşturulabilir. Ancak Web programları açısından önemli olan bir kaçı ve özellikleri şöyle saralanabilir:
INT Tamsayı: -2147483648'den 2147483647 kadar değişen diziye "signed" (işaretli), 0'dan 4294967295'e kadar değişenine "unsigned" (işaretsiz) denir.
VARCHAR(n) n sayısını geçmemek şartıyla değişen boyutta karakter olabilir.
CHAR(n) Kesinlikle n sayısı kadar karakter olabilir.
TEXT En fazla 65535(2^16-1) karakter alabilen metin alanı.
MEDIUMTEXT En fazla 16777215(2^24-1) karakter alabilen metin alanı.
DATE 1000-01-01'den 9999-12-31'e kadar değişebilen tarih alanı.
TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve Yıl+Ay+Gün+Saat+Dakika+Saniye biçimindeki zaman bilgisi.
MySQL Veri Türleri
MySQL'de bir çok veri türü oluşturulabilir. Ancak Web programları açısından önemli olan bir kaçı ve özellikleri şöyle sıralanabilir:
INT Tamsayı: -2147483648'den 2147483647 kadar değişen diziye "signed" (işaretli), 0'dan 4294967295'e kadar değişenine "unsigned" (işaretsiz) denir.
VARCHAR(n) n sayısını geçmemek şartıyla değişen boyutta karakter olabilir.
CHAR(n) Kesinlikle n sayısı kadar karakter olabilir.
TEXT En fazla 65535(2^16-1) karakter alabilen metin alanı.
MEDIUMTEXT En fazla 16777215(2^24-1) karakter alabilen metin alanı.
DATE 1000-01-01'den 9999-12-31'e kadar değişebilen tarih alanı.
TIMESTAMP 1 Ocak 1970'den 18 Ocak 2038'e kadar olan ve Yıl+Ay+Gün+Saat+Dakika+Saniye biçimindeki zaman bilgisi.