MySQL’de Collation’lar

UTF-8 bildiğiniz üzere çok geniş bir karakter setini destekliyor. Peki utf8_turkish_ci, utf8_general_ci, utf8_unicode_ci gibi collation’lar ne işe yarıyor?

Collation aslında tablodan select yaparken, tabloyu sıralarken ya da tablolar arasında join yaparken işimize yarayan bir şey. Hangi karakterlerin hangi karakterlerle aynı şeyi ifade ettiğine mysql bu bilgilere göre karar veriyor (collation tablosuna göre).

Örneğin utf8_turkish_ci olan bir tabloda, “cafe” kelimesi için select sorgusu yazdığınızda, sorgu size “café” içeren kayıtları da döndürmez; ama tablo utf8_general_ci ya da utf8_unicode_ci ise döndürür.

Bu collation’ların tablolarına şağıdaki linkten bakılabilir:

http://www.collation-charts.org/mysql60/mysql604.utf8_turkish_ci.html

http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html
http://www.collation-charts.org/mysql60/mysql604.utf8_unicode_ci.european.html

utf8_unicode_ci çok dillilik içeren sistemlerde geniş bir dil yelpazesinde sonuçlar sunuyor bize. Yaptığımız tabloların default collation’larını ve text fieldların collationlarını utf8_unicode_ci olarak ayarlarsak, üzerinde çalıştığımız sistemin çokdilliliği desteklemesini kolaylaştırmış oluruz.


Önemli bir not:
Farklı collation’lar arası join işlemi mümkün değil, bu yüzden tüm database için aynı collation’ı kullanmak en temiz çözüm.
Okumaya devam et “MySQL’de Collation’lar”

MySQL tablo yapılarında sayısal değerlerin yanındaki uzunluk ne işe yarıyor

MySQL tablo yapılarına baktığımızda tinyint(4) gibi değerler görüyoruz. Ya da int(11), bigint(20)

tinyint’in boyutu standart olarak 0-255 arası sayıları kapsıyor (unsigned ise eğer). Dolayısıyla tinyint(4) ‘nin anlamı kapasite ile alakalı olmamalı.

Eğer tablo yaratılırken zerofill seçilmişse, tinyint’in yanına yazdığımız uzunluğa ulaşana kadar sayının soluna 0 ekleniyor.

Yani çok fazla bir işe yarayan bir özellik değil.

Örneğin select sorgusu bize 35 geri dönecekse, eğer tablo yaratırken “tinyint(4) zerofill” demişsek 0035 geri dönecek.
Okumaya devam et “MySQL tablo yapılarında sayısal değerlerin yanındaki uzunluk ne işe yarıyor”

SQL ile tekrarlı kayıtları silmek

MySQL tablosundan tekrarlı kayıtların nasıl silineceği hakkında bilgi vereceğim. Tekrarlı kayıtları silmek disk alanından kazanmayı ve sorguların daha hızlı çalışmasını sağlar.

1. Yöntem

Bu yöntemde tekrarsız kayıtlar sorgulanarak yedek bir tabloya aktarılır, daha sonra ana tablo silinerek yadek tablonun adı ana tablo ile aynı yapılır. Öncelikle ana tablodan (tablo1) distinct kelimesi ile benzersiz kayıtlar listelenir. Distinct ifadesi tekrar eden kayıtları listelemez sadece birbirinden farklı kayıtlar getirilir. Geelen kayıtlar yeni bir tabloya kaydedilerek eski ktablo silinir. Sonuçta tekrarlı kayıtların ayıklandığı bir tablo elde edilmiş olur. Bu şöyle yapıyoruz:

CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1

Bu örnekte alan_adi1 isimli alana göre tekrarlı kayıtlar guruplanarak tek kayıda indirgeniyor ve dönen sonuçdan yeni_tablo isminde bir tablo oluşturuluyor. Tekrarlanan satırları tanımlamak için birden fazla alan da kullanılabilir.

CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1, alan_adi2, alan_adi3...

2. Yöntem

Bu kodu benim için oluşturan Emin Kadıoğlu dostuma teşekkür ederek kodu vermek istiyorum.

delete from ayrinti_tablo1 where a1no in <br/>(select a1no from (select b.a1no from ayrinti_tablo1 b where b.a1no not in <br/>(select c.a1no from ayrinti_tablo1 c group by c.atno)) as deneme);

SQL kodunu denemek için aşağıdaki veri yapısını kullanarabilirsiniz.


/*
MySQL Data Transfer
Source Host: localhost
Source Database: deneme
Target Host: localhost
Target Database: deneme
Date: 07.08.2008 18:05:56
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for ayrinti_tablo1
-- ----------------------------
CREATE TABLE `ayrinti_tablo1` (
  `a1no` int(11) NOT NULL auto_increment,
  `atno` int(11) default NULL,
  `bilgi1` varchar(100) default NULL,
  `bilgi2` varchar(100) default NULL,
  PRIMARY KEY  (`a1no`)
) ENGINE=MyISAM DEFAULT CHARSET=latin5;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `ayrinti_tablo1` VALUES ('23', '2', 'tret', null);
INSERT INTO `ayrinti_tablo1` VALUES ('27', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('28', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('29', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('22', '3', 're', null);
INSERT INTO `ayrinti_tablo1` VALUES ('31', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('26', '2', 'qwe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('30', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('25', '4', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('32', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('33', '2', 'wq', null);


tinyMy: small mysql console

tinyMy, MySQL veritabanlarını yönetmek için hazırlanmış küçük bir PHP betiğidir. tinyMy tek bir PHP dosyasından oluşan çok küçük ve basit bir betikdir.

Genellikle web üzerinden MySQL veritabanlarını yönetmek için phpMyAdmin kullanılsada bazı durumlarda phpMyAdmin biraz fazla gelebilmekte. phpMyAdmin birçok özelliği bünyesinde barındırıyor, çok fazla dosyadan oluşuyor ve bazen bu dosyaların boyutu ve kodların çokluğu sunucu başarımı açısından sorun teşkil edebiliyor. Ayrıca dial-up gibi düşük bir bağlantı söz konusu olduğunda biraz konfor kaybı olabiliyor. Çok fazla beklentiniz yoksa tinyMy size göre.

tinyMy ile veritabanındaki tabloların içeriğini ve yapısını görebilir, SQL çalıştırabilir ayrıca tablolarınızı dump edebilirsiniz. tinyMy betiğini buradan indirebilirsiniz.

Technorati : , ,
Del.icio.us : , ,
Zooomr : , ,
Flickr : , ,

MySQL ile bir tablonun kopyasını üretmek

Bir MySQL tablosunun üzerinde denemeler yapmadan önce onu yedeklemelisiniz. Yedek üzerinde çalışmak herzaman güzel bir davranıştır. Aşağıdaki SQL komutu ile çalışacağınız tablonun yedek olacak bir kopyasını üretebilirsiniz.

CREATE TABLE yedek_tablo SELECT * FROM asil_tablo

Eğer tablonuzda çok fazla veri varsa sadece asıl tablonun belirli satırlarından meydana gelen yedek bir tablo oluşturabilirsiniz. Bunun için aşağıdaki SQL cümlesini kullanabilirsiniz.

CREATE TABLE yedek_tablo
SELECT * FROM asil_tablo WHERE alan1='deger' LIMIT 0, 10000;

Yukarıdaki SQL’de asil_tablo’nun alan1 adlı alanında ‘deger’ verisi olan ilk 10,000 kayıt ile yedek_tablo oluşturuluyor.

Hertürlü projeniz için: EmbededMySQL

Projelerinizde gömülü olarak kolayca kullanabileceğiniz bir MySQL paketi hazırladım. Google’un bile kullandığı MySQL,herzaman performansı ve rahat kullanımıyla dikkat çeker. Ticari olmayan projelerdeki kullanımında herhangi bir kısıtlama olmayan MySQL veri tabanı sunucusunu, kolay bir şekilde her türlü projenizde kullanabilirsiniz.

Projelerinizde gömülü olarak kolayca kullanabileceğiniz bir MySQL paketi hazırladım. Google’un bile kullandığı MySQL,herzaman performansı ve rahat kullanımıyla dikkat çeker. Ticari olmayan projelerdeki kullanımında herhangi bir kısıtlama olmayan MySQL veri tabanı sunucusunu, kolay bir şekilde her türlü projenizde kullanabilirsiniz.
Okumaya devam et “Hertürlü projeniz için: EmbededMySQL”

ZEOSDBO Select * from hatasını gidermek

ZEOSDBO-6.6.2-rc ile ZQuery1.SQL.Add(‘select * from links’); sorgusunu çalıştırıp  ZQuery1.FieldbyName(‘title’).AsVariant; ile veriyi almaya calıştığımda aşağıdaki hata mesajını alıyordum;

Application raised an exception class EZSQLException with mesage ‘Column with name “Extra” was not found”

Nedenini anlayamadığım bu anlamsız istisna select * ile tüm alanlar seçildiğinde peydahlanırken, seçilecek alan isimleri belirtildiğinde oluşmuyor. Çözümü ilgili istisnayı yaratan kodu kapatmakla buldum. İgili kod ZDbcResultSet.pas dosyasının TZAbstractResultSet.GetColumnIndex isimli metodunda.

{**
Maps the given <code>ResultSet</code> column name to its
<code>ResultSet</code> column index.

@param columnName the name of the column
@return the column index of the given column name
}

function TZAbstractResultSet.GetColumnIndex(const ColumnName: string): Integer;
begin
Result := FindColumn(ColumnName);

//if Result < 1 then
//  raise EZSQLException.Create(Format(SColumnWasNotFound, [ColumnName]));
end;

MySQL: INSERT DELAYED

MySQL’in birdiğer güzel özelliği de Insert delayed. Burada yazdığına göre; Insert delayed, bir insert sorgusunun tamamlanmasını beklemeye gerek bırakmıyor. Genellikle log’lama uygulamalarında diğer select ve update sorgularından oluşan iş akışını duraksatmamasından dolayı kullanılan bir MySQL özelliği. Insert delayed ile insert sorguları, tablonun uygun olduğu bir anda eklenmek üzere belleğe alınır.

Başka bir güzel özelliğide birçok istemciden gelen insert delayed isteklerinin topluca tabloya yazılması. Bu birçok bağımsız insert’den daha hızlı gerçekleşir.

Tablo kullanımda olmasa bile, insert delayed normal insert’den daha yavaştır. Sunucu insert delayed ‘lerin işlem yaptığı tablolarda kuyruk oluşturmak ve uygun zamanı kollamak için bir miktar işlem gücü sarfeder.

SQL-Translator: Veritabanı dönüştürücüsü

SQL-Translator SQL formatında ihraç edilmiş (şimdilik sadece tablo şemasını çevirebiliyor) birçok veritabanını yine SQL formatında birbiri arasında dönüştüren bir perl scripti. Oracle, Sybase, or PostgreSQL gibi veritabanı tablolarını birbirine dönüştürebiliyor. Belki lazım olur.

Microsoft Access Permissions Explorer

PermExpl, Microsoft Access veritabanı (mdb) gibi Microsoft Jet veritabanını motorunu kullanan veritabanları üzerinde ileri düzey yetkilendirmeler yapmaya yarıyor. Kullanıcı ve kullanıcı gruplarını görme ve bu birimlere, tablo ve sorgu gibi nesneler üzerinde okuma, yazma ve oluşturma gibi izinlerin izlenmesini ve değiştirilebilmesini sağlıyor. PermExpl erişim tablosunda hasar oluşmuş veritabanlarına müdahale edilebilmesi açısından ileri düzey kullanıcılara hitap eden bir araç ve dikkatli kullanılması gerekiyor.

SQL için ayrılmış kelime kontrolü

SQL dili her nekadar bir standartta olsa da MySQL, Oracle ve MSSQL gibi farklı veritabanı sunucularında geçerli olabilecek programcı tanımlamaları farklılıklar göstermektedir. Bir kelimenin tablo, alan veya indeks isimleri gibi kullanıcı tanımlı girdilerde kullanılıp kullanılamaycağını bilmek gerekir. Bu sayfadan bir kelimenin en çok kullanılan veritabanı sunucularında kullanılıp kullanılmadığı sorgulanabiliyor.

phpMySQLAutoBackup – Otomatik yedekleme

phpMySQLAutoBackup MySQL veritabanlarının yedeklenmesini otomatik hale getiriyor. PHP script’i veritabanını okuyor (verileri ve yapıları), gzip biçiminde sıkıştırıyor ve belirttiğiniz e-posta adresine gönderiyor. Veritabanı kullanan ve verilerin güncelliğinin önemli olduğu web siteleri için mutlaka bir acil durum planı yapılmalıdır.

  • Barındırma hizmetini veren bilgisayardaki teknik sorundan veritabanları zarar görebilir
  • Sunucu bilgisayar saldırıya uğrayıp tüm veritabanları silinebilir 
  • Wweb uygulamanızın hatasından kaynaklana bir sebepten veritabanınız zarar görebilir
  • Uygulamanızı emanet ettiğiniz 2. kişi kazayda verileri silebilir

İşte bütün bu olası senaryolara karşı biz geliştiricilerin tedbirimizi elden bırakmamamız gerekiyor. Bu script sayesinde yukarıda saydığım durumlarda veritabanının güncel bir kopyasını posta kutunuzdan alıp yerine koyabilirsiniz. Güzel..

Biraz da script’i tanıtalım: run.php dosyasına, veritabanı bağlantı bilgilerini, e-posta adresini ve tabiki yedeklenecek tabloların adlarını giriyorsunuz. Peki yedekleme işlemi nasıl başlatılacak? /phpMySQLAutoBackup/run.php dosyasını tarayıcınız ile ziyaret ettiğinizde yedekleme başlatılacak ve yedek dosyaları run.php de belirttiğiniz e-posta adresine gönderilecek. Ayrıca run.php içerisindeki save_backup_zip_file_to_server değişkeninin değerini 1 yaparak dosyaların sunucuda da depolanmasını sağlayabiliyorsunuz. Bu işlemin zamanlamasının otomatik olarak yapılmasını istiyorsanız sistem görev zamanlayıcınızı (linux için crontab, windows için zamanlanmış görevler) ile veya phpJobScheduler‘ı kullanarak yapabilirsiniz.

Problem: PhpMyAdmin ile veri yükleme

Büyük sql dosyalarını veritabanı sunucusuna yüklemek bazen sıkıntılı olabiliyor. Benzer sorunu başkalarının da yaşama ihtimalini düşünerek  sorunun çözümü hakkında bilgi vermek istiyorum. Kullandığım hosting firması (site dosyalarını bilgisayarında barındıran firma) MySQL veritabanı sunucusuna doğrudan erişim vermemiş. Yani işlem yapmak için doğrudan veritabanı sunucusuna bağlanamıyorum.Servislere dışarıdan doğrudan erişiminin kapatılması (servisi izin verdiği standart arayüze) sunucu güvenliği açısından çok tercih edilen bir yöntem. Dışarıya nekadar az servis açık olursa güvenlik de o denli yüksek tutulmuş olur.

Büyük sql dosyalarını veritabanı sunucusuna yüklemek bazen sıkıntılı olabiliyor. Benzer sorunu başkalarının da yaşama ihtimalini düşünerek  sorunun çözümü hakkında bilgi vermek istiyorum. Kullandığım hosting firması (site dosyalarını bilgisayarında barındıran firma) MySQL veritabanı sunucusuna doğrudan erişim vermemiş. Yani işlem yapmak için doğrudan veritabanı sunucusuna bağlanamıyorum.Servislere dışarıdan doğrudan erişiminin kapatılması (servisi izin verdiği standart arayüze) sunucu güvenliği açısından çok tercih edilen bir yöntem. Dışarıya nekadar az servis açık olursa güvenlik de o denli yüksek tutulmuş olur.
Okumaya devam et “Problem: PhpMyAdmin ile veri yükleme”