2011-12-15 14 views
5

Temel olarak, eğer iki dizge benim veritabanımda aynı şekilde değerlendirirse, uygulama seviyesinde bunu da kontrol edebilmeyi isterdim. Örneğin, bir kişi bir arama alanına "bjork" girerse, PHP'nin MySQL'in yaptığı gibi "Björk" dizesine uymasını istiyorum.MySQLs öykünmesi PHP dizisi karşılaştırmalarında utf8_general_ci harmanlama

PHP'nin MySQL'in harmanlama seçeneklerine doğrudan bir eşdeğeri olmadığını ve bunu yapmanın en kolay yolu, dizeleri dönüştüren basit bir işlev yazmak, strtolower() kullanarak bunları küçük boyutlu küçük harf ve strstr yapmaktır.() çok baytlı karakterleri karşılık gelen ASCII eşdeğerleriyle değiştirmek.

Bu doğru bir varsayım mı? Herhangi bir kimse, çeşitli MySQL harmanlamaları yapacağı için (özellikle mevcut ihtiyaçlarım için, utf8_general_ci) strstr() işlevinin ikinci parametresi olarak kullanışlı bir fool prova dizisine sahip mi? Ya da, eksiktir, MySQL'deki farklı derlemelerin çeşitli karakterleri nasıl ele aldığına dair belgeleri nerede bulabilirim? (Bazı harmanlarda ß'nin S ve diğerlerinde Ss gibi davrandığını gördüm, ama her karakter değerlendirmesini özetlemedi.)

+0

bir MySQL sorgusu çalıştırmak ve harmanlama böylece MySQL sunucusundaki karşılaştırma çalıştırmak için, kendisine geçirilen dizeleri için kullanmak mysql söylemek mümkündür. çok hızlı olmayabilir ama tam olarak davranış yaratabilir. – hakre

+0

Bu verimliliğin çok önemli olduğunu eklemeliyim. – Thor

cevap

0

PHP harmanlama sınıfına baktınız mı? http://www.php.net/manual/en/class.collator.php

+0

Bu ilginç. Var olduğunu bilmiyordum. Ne yazık ki, hangi ayarların MySQL ile aynı şekilde davranacağını belgelerden öğrenemedim. Ayrıca, sanırım bir dizeyi bir dizi anahtarıyla karşılaştırmayı sağlayan dizeleri uyumlu hale getirme konusunda daha çok ilgileniyorum. – Thor

3

Kullanmakta olduğum şey, ancak henüz MySQL ile tam tutarlılık için test ettim.

-1

Aşağıdaki kodu deneyin.

$s1 = 'Björk'; 
$s2 = 'bjork'; 

var_dump(
    is_same_string($s1, $s2) 
); 

function is_same_string($str, $str2, $locale = 'en_US') 
{ 
    $coll = collator_create($locale); 
    collator_set_strength($coll, Collator::PRIMARY); 
    return 0 === collator_compare($coll, $str, $str2); 
} 
+0

"MySQLs utf8_general_ci collation [...] nasıl taklit edildi" ve "$ locale = 'en_US'" ile cevap verdiniz. Bu ikisinin eşit olduğundan emin misin? Utf8_general_ci 'a' = 'ą' ama 'L'! = 'Ł' ... – Kalmar