LIKE joker karakterini kullanarak bir sütunda nasıl (büyük / küçük harf duyarsız) arama yapabilirim?


289

Biraz etrafına baktım ve sonra ne olduğumu bulamadım.

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

Bu iyi çalışıyor, ancak ağaç Elm veya ELM vb.

Bu joker karakter araması için SQL durumunu nasıl duyarsız hale getirebilirim?

MySQL 5 ve Apache kullanıyorum.


3
Bu sayfada tökezlediyseniz ancak MySql ayarlarınız Elm veya ELM için bu sorgu üzerinde çalışıyorsa ve büyük / küçük harfe duyarlı olmasını İSTİYORSANIZ, BINARY
şuraya

Alan / tablo harmanlamasına bağlı değil mi? like 'ut8_general_CI'
Yousha Aleayoub

Düğüm sorgusu sequlize nasıl kullanılır?
Ashh

MySQL'ler likevarsayılan olarak büyük / küçük harfe duyarlı olmamalıdır.
Marko Bonaci

Yanıtlar:


281
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

Aslında, COLLATE UTF8_GENERAL_CIsütununuzun tanımına eklerseniz, tüm bu hileleri atlayabilirsiniz: otomatik olarak çalışacaktır.

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

Bu aynı zamanda, bu sütundaki tüm dizinleri '%' yöneltmeden sorgular için kullanılabilecek şekilde yeniden oluşturur


34
Aslında, COLLATE UTF8_GENERAL_CIsütununuzun tanımına eklerseniz, tüm bu hileleri atlayabilirsiniz: otomatik olarak çalışacaktır. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. Bu aynı zamanda, bu sütundaki tüm dizinleri '%' yöneltmeden sorgular için kullanılabilecek şekilde yeniden oluşturur.
Quassnoi

1
ALTER TABLO ağaçları KOLON başlık VARCHAR (…) DEĞİŞTİRİN Bu en iyi yol gibi görünüyor, çok teşekkürler ... sql işi yapalım
David Morrow

10
Samimi bir hatırlatma bu mysql bir cevap olduğunu. PostgreSQL kullanıyorsanız, ILike yukarıdaki sorunun çözümüdür.
Steve

2
@RajanRawal: Lütfen sorunuzu yorum olarak değil, soru olarak gönderin. Teşekkürler.
Quassnoi

1
Bu, orijinal harmanlamanız bin değil, genel olduğu sürece doğru cevaptır.
greenoldman

261

Ben her zaman daha düşük kullanarak çözdüm:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'

47
ve yağma endeksi kullanımı
Yaygın Duygunuz

3
MySQL 5'in bir ILIKE operatörü var mı?
Luke Maurer

27
%% araması için yine de önemli değil :)
Ortak Duygunuz

5
@Col. - Kuşkusuz, bu dizinlenmiş sütunlar için idealdir, ancak zaten mevcut olan bir yapı için çalışacaktır. Ayrıca, büyük / küçük harfe duyarlı olmayan aramaların, zaten dizine eklenmemiş sütunlarda daha sık olduğunu buldum.
cwallenpoole

1
Varsayılan harmanlama zaten CI. Yani asıl sorun bu özel soruda değil. Ama yine de mükemmel SO-tarzı cevap.
Ortak Duygunuz

48

Büyük / küçük harf duyarlılığı sütunlar / tablolar / veritabanı harmanlama ayarlarında tanımlanır. Sorguyu belirli bir harmanlama altında aşağıdaki şekilde yapabilirsiniz:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

Örneğin.

( utf8_general_ciYararlı bulduğunuz harmanlama ile değiştirin ). _ciAçılımı Case insensitive .


1
MySQL 5.6 sürümünde ERROR 1273 (HY000): Bilinmeyen harmanlama: 'utf_general_ci' . Bu harmanlama MySQL kaldırıldı sanırım? utf8_general_ciYine de iyi çalışıyor.
Mark Amery

1
Aynı sorun vardı. Sen Ya düzeltmek zorunda COLLATEya da benzeri basit bir hile yapmak bu bir ( LOWER()karşılaştırma önce dizeleri ikisi)
Menelaos Kotsollaris

MySQL 5.6+ veya MariaDB 10+ sürümünde, durumunuzdan önce COLLATE talimatını vermeniz yeterlidir. Yani bu işe yarıyor:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
stamster

41

Basit bir LIKE sorgusu örneği:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

Şimdi, LOWER () işlevini kullanarak büyük / küçük harfe duyarlı değil:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')

3
Aslında bu özellikle COLLATEformat sorunları ile karşı karşıya olduğunuzda oldukça güzel bir çözüm
Menelaos Kotsollaris

27

Basitçe kullanın:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";

Veya kullan

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

Her iki işlev de aynı şekilde çalışır


15

Ben böyle bir şey yapıyorum.

Değerleri küçük harfle ve MySQL ile geri kalanı

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");

Ve MySQL PDO Alternatifi için:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();

6

Ben bu sorgu büyük / küçük harf duyarsız bir arama yapacağını düşünüyorum:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

1
Sorgularımda ILIKE kullanırken mysql 5.5'te sözdizimi hatası alıyorum
Steel Brain

18
Bu sadece PostgreSQL için geçerlidir; MySQL değil. postgresql.org/docs/current/static/functions-matching.html
Martin Tournoij

Daha önce de belirtildiği gibi, soru MySQL hakkındaydı ve cevap PostgreSQL hakkında ve cehennem MySQL ile çalışmadığından emin. Aşağı oy vermem ama yukarı oyların nereden geldiğini merak
etmem

5

kullanım ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

benim için çalıştı !!


9
MySQL yok değil iLike destekler.
ttarchala

3
PostgreSQL için işe yarıyor, soru MySQL ile ilgiliydi.
Telmo Trooper

4

ALTERHerhangi bir masaya ihtiyacınız yok . SELECTJoker karakteri kullanmak istediğiniz gerçek sorgudan önce aşağıdaki sorguları kullanmanız yeterlidir:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;

2
Bu çok önemsiz bir yorum. Soruyu en genel olarak ele alır. Soru karşılaştırma karşılaştırma sadece bir sütun ile sınırlı isteyebilir gibi alter tablo sözdizimi de önemli olduğunu düşünüyorum.
Brian Chrisman

1

mysql 5.5'te, operatör gibi duyarsızdır ... yani vale'iniz karaağaç veya ELM veya Elm veya eLM veya başka bir şeyse ve '% elm%' gibi kullanırsanız, eşleşen tüm değerleri listeler.

MySQL'in önceki sürümleri hakkında söyleyemem.

Oracle'a giderseniz, büyük / küçük harfe duyarlı gibi çalışın, bu yüzden '% elm%' gibi yazarsanız, yalnızca bunun için gidecek ve büyük harfleri yoksayacak.

Garip, ama bu böyle :)


Bu tamamen doğru değil. Yalnızca harmanlama *_ci"büyük / küçük harf duyarsız" anlamına gelirse, bu şekilde çalışır . Bu, desteklenen tüm karakter kümeleri için varsayılan olduğu için ( show character set;bunu kontrol etme sorunu ) - cevap kısmen doğrudur :-) Sadece neden yanlış. Büyük / küçük harfe duyarlı olmayan operatör değil, varsayılan harmanlamadır.
silverdr

evet sana katılıyorum Bu karakter bağlıdır ve hala * _ci karakteri ile üretimde iseniz o zaman tek seçenek nerede önce cümle kullanmaktır
user21546

1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 

galeri tablo adı, adı tablodaki sütun,
user4189641

2
Ne işe yaradığını kodunuzu gösteren bazı explnataion ekleyebilir ve nasıl yardımcı geçiniz - Bu irade yardımcı diğerleri gelecekte
Bizim Man Bananas

0

Tablolarınız için uygun kodlamayı ve harmanlamayı ayarlamanız gerekir.

Tablo kodlaması, gerçek veri kodlamasını yansıtmalıdır. Veri kodlamanız nedir?

Tablo kodlamasını görmek için bir sorgu çalıştırabilirsiniz SHOW CREATE TABLE tablename


0

Duyarsız vaka aramaları geliştirmek istediğimde, karşılaştırma yapmadan önce her dizeyi her zaman küçük harfe dönüştürürüm


0

Aşağıdaki yöntemi kullanabilirsiniz

 private function generateStringCondition($value = '',$field = '', $operator = '', $regex = '', $wildcardStart = '', $wildcardEnd = ''){
        if($value != ''){
            $where = " $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd' ";

            $searchArray = explode(' ', $value);

            if(sizeof($searchArray) > 1){

                foreach ($searchArray as $key=>$value){
                    $where .="$operator $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd'";
                }

            }

        }else{
            $where = '';
        }
        return $where;
    }

aşağıdaki gibi bu yöntemi kullanın

   $where =  $this->generateStringCondition($yourSearchString,  'LOWER(columnName)','or', 'like',  '%', '%');
  $sql = "select * from table $where";

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.