Apakah operator LIKE peka huruf besar kecil dengan MSSQL Server?

99

Dalam dokumentasi tentang operator LIKE , tidak ada yang diberitahukan tentang sensitivitas huruf. Apakah itu? Bagaimana cara mengaktifkan / menonaktifkannya?

Saya menanyakan varchar(n)kolom, pada penginstalan Microsoft SQL Server 2005, jika itu penting.

Marcel
sumber
14
Itu tergantung pada pemeriksaan kolom (atau database) Anda. Jika peka huruf besar / kecil, maka LIKEpeka huruf besar / kecil, jika tidak, maka LIKEtidak
Lamak
Periksa dokumentasi tentang SQL-Server collations msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
GarethD
Apa tujuanmu? Apakah Anda ingin peka huruf besar / kecil, atau tidak peka huruf besar / kecil?
Aaron Bertrand
1
Sensitivitas huruf default ke pemeriksaan di kolom yang default ke yang ada di database. Sebagian besar bisa dibulatkan, ke mana Anda ingin pergi?
Tony Hopkinson

Jawaban:

101

Bukan operator yang peka huruf besar kecil, melainkan kolom itu sendiri.

Ketika penginstalan SQL Server dilakukan pemeriksaan default dipilih untuk contoh. Kecuali secara eksplisit disebutkan sebaliknya (periksa klausa penyusunan di bawah) saat database baru dibuat, database tersebut mewarisi pemeriksaan dari instance dan saat kolom baru dibuat, ia mewarisi pemeriksaan dari database yang dimilikinya.

Kumpulan seperti sql_latin1_general_cp1_ci_asmenentukan bagaimana konten kolom harus diperlakukan. CI adalah singkatan dari case insensitive dan AS adalah singkatan dari accent sensitive.

Daftar lengkap collation tersedia di https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx

(a) Untuk memeriksa pemeriksaan instance

select serverproperty('collation')

(b) Untuk memeriksa pemeriksaan database

select databasepropertyex('databasename', 'collation') sqlcollation

(c) Untuk membuat database menggunakan pemeriksaan yang berbeda

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) Untuk membuat kolom menggunakan susunan yang berbeda

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(e) Untuk mengubah susunan kolom

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

Dimungkinkan untuk mengubah contoh dan kumpulan database tetapi itu tidak mempengaruhi objek yang dibuat sebelumnya.

Dimungkinkan juga untuk mengubah susunan kolom dengan cepat untuk perbandingan string, tetapi ini sangat tidak disarankan dalam lingkungan produksi karena sangat mahal.

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1
lolol
sumber
5
Tampaknya rentang karakter seperti [A-Z]selalu tidak peka huruf besar / kecil. [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]Namun tampaknya mematuhi pemeriksaan.
jumxozizi
1
Selain itu, Anda dapat menanyakan sensitivitas huruf dari kolom tertentu dengan sesuatu seperti ini:select COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn'
Jeppe Stig Nielsen
@jumxozizi Saya menambahkan saran Anda ke jawaban.
John Zabroski
@JeppeStigNielsen Saya menambahkan saran Anda ke jawaban.
John Zabroski
18

Semua pembicaraan tentang pemeriksaan ini tampaknya agak terlalu rumit. Mengapa tidak menggunakan sesuatu seperti:

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'

Maka cek Anda tidak peka huruf besar / kecil apa pun pemeriksaannya

Phil R
sumber
10
Karena ini tidak masuk akal. Contoh Anda menggunakan variabel dan karakter pengganti terkemuka. Tetapi terhadap kolom yang diindeks dengan pemeriksaan case insensitive like 'a%'dapat menggunakan indeks dan upperversinya tidak bisa.
Martin Smith
3
Pertanyaannya adalah apakah likeoperator peka huruf besar kecil atau tidak .
jumxozizi
Anda perlu mengetahui pemeriksaannya, jika tidak melakukan ini bisa jadi tidak ada gunanya. Misalnya, jika kolom ditanyakan terhadap penggunaan Latin1_General_CI_AS, maka melakukan UPPER(@@VALUE) NOT LIKE '%SOMETHING%'atau @@COLUMN NOT LIKE '%SOMETHING%'tidak relevan: hasilnya akan sama.
rsenna
13

Anda memiliki opsi untuk menentukan urutan pemeriksaan pada saat menentukan tabel Anda. Jika Anda menetapkan urutan peka huruf besar / kecil, LIKEoperator Anda akan berperilaku peka huruf besar / kecil; jika Anda menentukan urutan pemeriksaan tidak peka huruf besar kecil, LIKEoperator juga akan mengabaikan huruf besar dan kecil:

CREATE TABLE Test (
    CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);

Berikut adalah demo singkat di sqlfiddle yang menunjukkan hasil susunan urutan pada pencarian dengan LIKE.

dasblinkenlight
sumber
12

Jika Anda ingin mencapai pencarian yang peka huruf besar kecil tanpa mengubah susunan kolom / database / server, Anda selalu dapat menggunakan COLLATEklausa, misalnya

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 1 row

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
-- 2 rows

GO    
DROP TABLE dbo.foo;

Bekerja dengan cara lain, juga, jika kolom / database / server Anda case sensitive dan Anda tidak ingin pencarian case sensitive, mis

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 2 rows

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
-- 1 row

GO
DROP TABLE dbo.foo;
Aaron Bertrand
sumber
Berhati-hatilah pada query terakhir jika Anda menggunakannya WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'akan mengembalikan Johnseperti pada collation capital Jini antara huruf kecil jdan huruf kecil k. Ini seperti aAbBcC...jJkKlLmM...yang tidak jelas. Tampaknya Latin1_General_BINlebih dapat diprediksi dengan pencarian jangkauan dengan operator LIKE.
wqw
7

The likeOperator mengambil dua string. String ini harus memiliki collation yang kompatibel, yang dijelaskan di sini .

Menurut pendapat saya, hal-hal menjadi rumit. Kueri berikut mengembalikan kesalahan yang mengatakan bahwa pemeriksaan tidak kompatibel:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

Di mesin acak di sini, pemeriksaan default adalah SQL_Latin1_General_CP1_CI_AS. Kueri berikut berhasil, tetapi tidak mengembalikan baris:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

Nilai "abc" dan "ABC" tidak cocok di dunia yang peka huruf besar / kecil.

Dengan kata lain, ada perbedaan antara tidak memiliki pemeriksaan dan menggunakan pemeriksaan default. Jika satu sisi tidak memiliki pemeriksaan, maka pemeriksaan "ditetapkan" secara eksplisit dari sisi lain.

(Hasilnya sama saat pemeriksaan eksplisit ada di sebelah kiri.)

Gordon Linoff
sumber
Dapatkah Anda mereproduksi kesalahan pada tabel yang BUKAN objek sistem seperti INFORMATION_SCHEMA.TABLES?
Aaron Bertrand
@AaronRrand. . . Ya saya bisa. Apakah database rusak;)?
Gordon Linoff
Tidak tahu, saya sedang menggunakan perangkat seluler dan tidak dapat menjalankan VM Windows. Saya hanya tidak tahu bahwa seluruh deskripsi Anda secara teknis akurat.
Aaron Bertrand
4

Coba lari,

SELECT SERVERPROPERTY('COLLATION')

Kemudian cari tahu apakah pemeriksaan Anda peka huruf besar / kecil atau tidak.

RandomUs1r
sumber
1

Anda dapat mengubah dari properti setiap item.

hal - hal sensitif

Daniel Cadena
sumber
0

Anda dapat dengan mudah mengubah pemeriksaan di studio Microsoft SQL Server Management.

  • tabel klik kanan -> desain.
  • pilih kolom Anda, gulir ke bawah i kolom properti ke Collation.
  • Tetapkan preferensi pengurutan Anda dengan mencentang "Peka Huruf Besar-Kecil"
Anders Finn Jørgensen
sumber