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?
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:
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 latin1
olduğ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 |
+----+-------+
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
, POSITION
ya INSTR
.
Örneğin:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
Normal ifade ( RLIKE
veya 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
,, VARCHAR
ve 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%';
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 1
o "büyük" olduğunu ve eğer 0
o "eşit" ise, ne zaman StrComp()=0
, bir harf duyarlı maçımız var.
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.