WHERE yan tümcesinde büyük / küçük harfe duyarlı bir arama nasıl yapılır?


21

SQL sorgusunda büyük / küçük harfe duyarlı arama istiyorum. Ancak varsayılan olarak, MySQL dizelerin durumunu dikkate almaz.

SQL sorgusunda büyük / küçük harfe duyarlı bir arama nasıl yapılır?

Yanıtlar:


22

varsayılan olarak, MySQL dizelerin durumunu dikkate almaz

Bu tam olarak doğru değil. MySQL'de create database, veritabanı / şemada bir karakter kümesi ve bir harmanlama bulunur. Her karakter kümesinin varsayılan harmanlaması vardır; daha fazla bilgi için buraya bakın .

Karakter kümesi için varsayılan harmanlama latin1olduğunu latin1_swedish_ci, küçük harf duyarsız olması umulur.

Büyük / küçük harfe duyarlı bir harmanlama seçebilirsiniz, örneğin latin1_general_cs( MySQL dilbilgisi ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

Bunun gruplama ve eşitlik gibi şeyler üzerinde etkisi vardır. Örneğin,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

Büyük / küçük harfe duyarlı bir veritabanında:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

Büyük / küçük harfe duyarlı olmayan bir veritabanındayken:

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

Harmanlamayı bir sorgu içinden de değiştirebileceğinizi unutmayın . Örneğin, büyük / küçük harfe duyarlı veritabanında,

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

Hangi MySQL sürümünü kullandığınızı sorunuza açıklamalısınız, çünkü MySQL sürekli geliştirilmektedir.

Tamam, sorunuza geri dönelim:

Eğer herhangi bir işlevi kullanmak böylece MySQL dize fonksiyonları, her zaman böyle duyarlı LOCATE, POSITIONya INSTR.

Örneğin:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

Normal ifade ( RLIKEveya REGEXP) ile eşleşen desen , en yeni 3.23.4 dışındaki tüm MySQL sürümleri için her zaman büyük / küçük harfe duyarlıdır.

Örneğin:

SELECT phone FROM user WHERE user_name REGEXP 'term';

Hem normal karşılaştırma (=) hem de SQL kalıp eşleme ( LIKE) için davranış, ilgili alanlara bağlıdır:

a. CHAR,, VARCHARve TEXT alanlarının tüm varyantları büyük / küçük harfe duyarlı değildir.

b. CHAR BINARY, VARCHAR BINARY Ve BLOB alanları her varyantları hassas durumda benzerlikler nelerdir.

(A) 'dan bir alanı (b)' den bir alanla karşılaştırırsanız, karşılaştırma büyük / küçük harfe duyarlıdır (büyük / küçük harf duyarlılığı kazanır). MySQL Başvuru Kılavuzu'nun "7.2.7 Dize türleri" bölümüne bakın ve sıralama ve karşılaştırmalar ile ilgili ifadeleri arayın.

V3.23.0'dan başlayarak BINARY, ilgili alan türlerinden bağımsız olarak, döküm operatörü ile büyük / küçük harf duyarlılığı arasında bir karşılaştırma yapmak da mümkündür . Bkz. MySQL Başvuru Kılavuzunun "7.3.7 Döküm operatörleri" bölümü.

Bu nedenle, kullanıcı_adı türünü de değiştirebilir veya V3.23.x ile aşağıdakileri yapabilirsiniz:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

In my Kullanım: durum, ben Access 2010 kullanıyorum, ama aynı problem vardı ama çözüm farklıdır StrComp()sıfır olma dönüşünü fonksiyonu ve test edin.

StrComp( thing, 'abc', 0) = 0

Çünkü StrComp()döner -1İlk argüman, "küçük" ise 1o "büyük" olduğunu ve eğer 0o "eşit" ise, ne zaman StrComp()=0, bir harf duyarlı maçımız var.

Bkz burada , burada ya burada .


0

Bu, karakter kümesinden bağımsız olarak MySQL'de çalışacaktır. SONUÇ OLARAK 'test' REGEXP İKİLİ 'TESTİ' SEÇİN; 'İKİLİ' koymak ikili bir karşılaştırmayı zorlar.


-2

Duyarsız arama için bunu deneyin, mükemmel performansla iyi çalışır:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
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.