MySQL büyük / küçük harfe duyarlı olmayan seçim


242

Herkes MySQL SELECTsorgusunun büyük / küçük harfe duyarlı mı yoksa varsayılan olarak büyük / küçük harfe duyarlı olmadığını söyleyebilir mi? Ve değilse, hangi sorguyu göndermek zorundayım, böylece böyle bir şey yapabilirim:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

Nerede gerçekte, gerçek değeri Valueolan IAreSavage.


44
Sonuçta dosyalama harmanlamasına bağlıdır - eğer '_ci' (büyük / küçük harf duyarlı) veya '_cs' (büyük / küçük harf duyarlı)
Jovan Perovic

15
Bu kötü ifade edilen bir sorudur;). Cevapların yarısı, büyük / küçük harfe duyarlı olmayan karşılaştırmanın nasıl yapılacağını, yarısı büyük / küçük harfe duyarlı olmayı hedefliyor. Ve sadece 1 size varsayılanın aslında duyarsız olduğunu söyler. :) Böyle bir karşılaştırma yaptığınızda bile vaka duyarsızlığının işe yaradığını belirtmek gerekir'value' in ('val1', 'val2', 'val3')
SaltyNuts

5
@SaltyNuts adam, 7 yıl sonra bu soruyu okumak ve ne kadar bir noob olduğumu anlamak utanç verici! Ben sadece belgeleri okumak olabilir ve cevap SELECT ifadeleri hakkında ilk cümle gibi ...
NoodleOfDeath

@JovanPerovic'in söylediklerine eklemek için utf8_bin de onu büyük / küçük harfe duyarlı hale getirir. Bunun o zaman var olup olmadığından emin değilim
Chiwda

Yanıtlar:


494

İkili bir karşılaştırma yapmadığınız sürece büyük / küçük harfe duyarsızdırlar .


3
Çoğunlukla Tim'in yorumuna katılıyorum, her yerde değerlerinizde bir "düşük ()" yapmanın en iyi yol olduğunu düşünmüyorum, bir çözüm gibi görünüyor. Ama bazen mantıklı ve daha kolay olduğunu itiraf ediyorum. (Colin harmanlamanın daha iyi olduğundan bahsetti.) Tarihsel veriler mysql tablosuna taşındı ve bazı sütun değerlerinin duyarsız durumu nedeniyle eski mantığı bozdu. Biz "GE1234" ve "ge1234" arasındaki farkı bilmek gerekiyordu, benzersiz olması ve bu şekilde kayıt tutulması gerekiyordu. Sütunlarımızı tablo oluştur ifadesinde şu şekilde ayarladık: varchar (20) CHARACTER SET utf8 COLLATE
utf8_bin

19
Neden bu kadar çok insanın oy verdiğini bilmiyorum. Burada dev.mysql.com/doc/refman/5.0/tr/case-sensitivity.html açıkça belirtiyor "... bu, alfabetik karakterler için karşılaştırmanın büyük / küçük harfe duyarlı olacağı anlamına geliyor." Bu yüzden 'DickSavagewood' ararsam 'dicksavagewood' almaz. Aynı işlemi LOWER () ile yapacağınız ALACAKTIR. Bu soruya cevabım: sizin özel durumunuzda SELECT gerçekten büyük / küçük harfe duyarlıdır.
Luftwaffle

10
@ user1961753: Tekrar okuyun: "İkili dizeler için (varbinary, blob) ... büyük / küçük harfe duyarlı olacaktır".
Marc B

1
@MarcB Bu bağlantı artık kesik. Tamir edebilir misin? :)
Phiter

5
Jovan'ın dediği gibi, harmanlamaya bağlıdır, bu yüzden bu cevap hemen hemen yanlıştır.
phil294

117

Değeri ve iletilen parametreyi küçük harflerle yazabilirsiniz:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

Başka bir (daha iyi) yol, COLLATEoperatörü dokümantasyonda belirtildiği gibi kullanmak olacaktır.


21
Bu SELECTifade COLLATEo zaman nasıl kullanılır ?
Evet Barry

11
Yukarıdaki atıfta bulunulan dokümantasyon sayfasında, "normal olmayan dize karşılaştırmaları varsayılan olarak büyük / küçük harfe duyarlı değildir" diyor.
Görev Aradı Aronsson

9
Bu cevabı kaç kişinin onayladığını korkutuyor. @Marc'ın yukarıda açıkladığı gibi, karşılaştırmalar büyük / küçük harfe duyarlı değildir. Harmanlamaları ve dizinleri anlamanız ve bunları doğru bir şekilde yapılandırmanız gerekir - dize dönüşümlerini LOWER()veya rastgele bir COLLATEcümle kullanmak tamamen bir dizini tamamen atlayabilir ve zaman içinde tablonuz büyüdükçe, bunun ciddi performans etkileri olabilir. Muhtemelen bunlar aradığınız kullanıcı adları mı? Büyük / küçük harfe duyarlı olmayan bir harmanlama kullanın ve sütuna benzersiz bir dizin ekleyin. EXPLAINDizinin kullanıldığını onaylamak için kullanın .
mindplay.dk

1
Ben mindplay.dk ... upper () ve lower () ile aynı dizini atlamak üzereydim ve doğrudan büyük veritabanı tablolarında performansı etkiler.
GTodorov

Mindplay.dk ve GTodorov'un görüşlerine katılıyorum. Nerede cümle içinde bir hedef sütun üzerinde bazı yöntemleri kullanarak dikkatli olun. Sütunun dizini işe yaramaz olabilir. EXPLAIN kullanın!
hain

51

İKİLİ KULLANIN

Bu basit bir seçim

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

Bu ikili ile bir seçim

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

veya

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
Ne zaman = (SELT * 'dan my Bable BINARY' bir şey '=' Bir şey ') BINARY kullanmak ne zaman mantıklıdır?
Jimmy

@Jimmy Tam olarak ne demek istiyorsun? Kod çalışır. Karşılaştırmadaki bir taraf ikiliye alındığında karşılaştırma ikili yapılır.
Jori

@Jori Oh, sanırım yanlış okudum - iki örnekten birinin eşitin her iki tarafında İKİLİ olduğunu düşündüm.
Jimmy

Ben sadece buna oy verdim çünkü bu gerçekten doğru cevap. MySQL web sitesindeki belgelere göre, BINARY komutunu kullanmanın, kelimelerinizi / isteğinizi belirli bir dile yazmaya çalışmaktan daha iyi olduğunu söylüyorlar çünkü BINARY komutu her şeyi olduğu gibi bırakıp tam olarak sunulmaktadır. Bir cevap aramaya geldiğimde - buradaki iki cevap beni MySQL web sitesine ve belgelerine bakmaya yönlendirdi. BINARY kullanmak daha iyidir. Çeviri başka sorunlara neden olabilir.
Mark Manning

43

Karşılaştırmalar olan küçük harf duyarlı kolonu ile sona eren bir harmanlama kullandığında _ci(örneğin , varsayılan latin1_general_ci olduklarını harmanlama) ve harf duyarlı kolonu olan uçları bir harmanlama kullandığında _csveya _bin(örneğin, utf8_unicode_csveutf8_bin harmanlamalarla) .

Harmanlamayı kontrol et

Sunucunuzu , veritabanınızı ve bağlantı harmanlamalarınızı aşağıdakileri kullanarak kontrol edebilirsiniz :

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

ve tablo harmanlama yöntemini kullanarak şunları kontrol edebilirsiniz :

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

Harmanlamayı değiştir

Veritabanınızı, tablonuzu veya sütun harmanlamayı, büyük / küçük harfe duyarlı bir şeyle aşağıdaki gibi değiştirebilirsiniz:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

Karşılaştırmanız artık büyük / küçük harfe duyarlı olmalıdır.


25

WHERE ifadesindeki dize karşılaştırması büyük / küçük harfe duyarlı değildir. Kullanarak karşılaştırmayı deneyebilirsiniz

WHERE `colname` = 'keyword'

veya

WHERE `colname` = 'KeyWord'

ve aynı sonucu elde edersiniz . MySQL'in varsayılan davranışı budur.

Karşılaştırmanın büyük / küçük harfe duyarlı olmasını istiyorsanız , şu şekilde ekleyebilirsiniz COLLATE:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

Bu SQL bununla farklı sonuç verir: WHERE colnameCOLLATE latin1_general_cs = 'anahtar kelime'

latin1_general_cs çoğu veritabanında ortak veya varsayılan harmanlamadır.


16

Seçtiğiniz harmanlama, büyük / küçük harfe duyarlı olup olmadığınızı belirler.


9

Varsayılan büyük / küçük harfe duyarsızdır, ancak bir göz atmanız gereken en önemli şey tablonun nasıl oluşturulduğudur, çünkü tabloyu oluştururken büyük / küçük harfe duyarlılığı belirleyebilirsiniz.

Aşağıdaki komut dosyası bir tablo oluşturur. En alttaki "COLLATE latin1_general_cs" yazıyor. Sonunda cs, büyük / küçük harfe duyarlı anlamına gelir. Tablonuzun büyük / küçük harfe duyarsız olmasını istiyorsanız, o parçayı dışarıda bırakabilir veya "COLLATE latin1_general_ci" kullanabilirsiniz.

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

Projeniz kendi tablonuzu oluşturacak şekildeyse, tabloyu oluştururken büyük / küçük harfe duyarlılık tercihinizi belirtmek mantıklıdır.




2

Ayrıca lower_case_table_nameyapılandırma yönergesini 1 olarak ayarlamadığınız sürece tablo adlarının Linux'ta büyük / küçük harfe duyarlı olduğunu unutmayın . Bunun nedeni, tabloların Linux'ta büyük / küçük harfe duyarlı dosyalar tarafından temsil edilmesidir.

Özellikle büyük / küçük harfe duyarlı olmayan ve nerede üretime dağıtılmayan Windows üzerinde gelişmelere dikkat edin. Örneğin:

"SELECT * from mytable" 

myTable tablosuna karşı Windows'da başarılı olacak, ancak yukarıda belirtilen yönerge ayarlanmadığı sürece tekrar Linux'ta başarısız olacaktır.

Burada referans alın: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html


1
+1 - Büyük / küçük harf duyarsız sorgular yazma ve ardından Linux'larda başarısız olma senaryosu projemizde çok oldu
Vic

@Vic Projemle aynı sorunu yaşıyorum. Lütfen bana nasıl düzelttiğini söyler misin?
Kamran Ahmed

@KamranAhmed, tablo adlarının kasasını tam olarak oluşturma komut dosyalarında göründüğü gibi kullanmanız gerekir
Vic

@Vic son çare olurdu, kelimenin tam anlamıyla tonlarca sorguyu değiştirmek zorunda kalacağım. Bunu yapmanın kolay bir yolu olup olmadığını merak ediyordum. Yine de teşekkürler!
Kamran Ahmed

@KamranAhmed, lower_case_table_namealtında yorumladığımız cevapta belirtildiği gibi değiştirmeyi deneyin
Vic

1

Şu anda kabul edilen çözüm çoğunlukla doğrudur.

Normal olmayan bir dize (CHAR, VARCHAR, TEXT) kullanıyorsanız, karşılaştırmalar büyük / küçük harfe duyarlı değildir varsayılan harmanlamaya göre .

İkili bir dize (BINARY, VARBINARY, BLOB) kullanıyorsanız, karşılaştırmalar büyük / küçük harfe duyarlıdır, bu nedenle kullanmanız gerekir LOWER diğer yanıtlarda açıklandığı gibi .

Varsayılan harmanlamayı kullanmıyorsanız ve ikili olmayan bir dize kullanıyorsanız, büyük / küçük harfe duyarlılık seçilen harmanlama tarafından belirlenir.

Kaynak: https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html . Yakından okuyun. Bazıları bunu karşılaştırmaların mutlaka büyük / küçük harfe duyarlı veya duyarsız olduğunu söylemekle karıştırmıştır. Olay bu değil.


0

Deneyebilirsin. yararlı olacağını umuyoruz.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

İkili bayrak ayarlı dize alanları her zaman büyük / küçük harfe duyarlıdır. İkili olmayan bir metin alanı için büyük / küçük harfe duyarlı bir aramaya ihtiyacınız varsa bunu kullanın: SONUÇ OLARAK 'test' REGEXP İKİLİ 'TESTİ' SEÇİN;

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.