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.