2009-09-11 22 views
39

Jak sprawdzić, czy w bazie danych w programie SQL Server jest rozróżniana wielkość liter? I zostały wcześniej uruchomione zapytanie:Sprawdzanie wielkości liter w programie SQL Server w celu sprawdzenia wielkości liter?

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END 

Ale szukam innych sposobów, jak to rzeczywiście dał mi problemy w przeszłości.

Edytuj - Trochę więcej informacji: Istniejący produkt ma wiele wstępnie zapisanych procedur przechowywanych. W przechowywanej procedurze zależy od czułości samego serwera. Więc to, czego szukam, to najlepszy sposób na sprawdzenie serwera pod kątem jego wrażliwości.

+2

Jeśli masz wątpliwości, kieruj obie strony porównania na wielkie z GÓRNY ... –

Odpowiedz

62

Sortowanie można ustawić na różnych poziomach:

  1. Server
  2. Database
  3. Kolumna

Więc można mieć wielkość liter kolumny w bazie danych nie uwzględnia wielkości liter. Jeszcze nie spotkałem się z sytuacją, w której można by przedstawić argumenty biznesowe dotyczące rozróżnienia wielkości liter w pojedynczej kolumnie danych, ale przypuszczam, że może być.

Sprawdź Server Sortowanie

SELECT SERVERPROPERTY('COLLATION') 

Sprawdź Database Sortowanie

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 

Sprawdź Kolumna Sortowanie

select table_name, column_name, collation_name 
from INFORMATION_SCHEMA.COLUMNS 
where table_name = @table_name 
+25

Dla dobra kompletności, możesz ustawić sortowanie również w SQL używając 'SELECT * FROM foo gdzie x = 'y' COLLATE sql_latin1_general_cp1_cs_as' –

+0

Skąd dowiedziałeś się, że mały złoty samorodek' COLLATE sql_latin1_general_cp1_cs_as'? – Coops

+6

Po prostu dodaje się do układanki jeszcze jeden element: jeśli nazwa kolacji zawiera _CI_, wielkość liter nie ma znaczenia, jeśli zawiera ona _CS_, rozróżniana jest wielkość liter. [Czytaj więcej w witrynie MSDN] (https://msdn.microsoft.com/en-us/library/ms180175.aspx) –

-2

W SQL Server nie jest rozróżniana wielkość liter. SELECT * FROM SomeTable jest taki sam jak SeLeCT * frOM soMetaBLe.

+0

Nie o tym mówi. Ma na myśli porównanie _data_, a nie sposób przetwarzania kodu. –

+0

Myślę, że pytanie dotyczy porównywania danych w sposób niewrażliwy na wielkość liter - nie o to, czy w instrukcjach T-SQL rozróżniana jest wielkość liter. –

+2

Sposób, w jaki jest sformułowany, brzmi, jakby pytał, czy rozróżniana jest wielkość liter. Myślę, że głosowanie w dół jest trochę niesprawiedliwe. –

4

Jesteś zainteresowany układaniem. Można zbudować coś na podstawie tego fragmentu:

SELECT DATABASEPROPERTYEX('master', 'Collation'); 

Aktualizacja
oparciu o edycję — Jeśli @test i @TEST może kiedykolwiek odnoszą się do dwóch różnych zmiennych, to nie jest SQL Server. Jeśli widzisz problemy, w których sama zmienna nie jest równa samej sobie, sprawdź, czy ta zmienna to NULL, ponieważ NULL = NULL zwraca "fałsz".

+1

'NULL = NULL' test byłby zależny od ANSI_NULLS, nieprawdaż? 'gdzie NULL IS NULL' zwróci wartość true (Obsługa wartości NULL w zapytaniach MSSQL) [http://www.peter-urda.com/2010/11/handling-null-values-in-mssql-queries] – Coops

32

Jeśli zainstalowany SQL Server z domyślnych opcjach sortowania, może się okazać, że następujące kwerendy zwraca te same wyniki:

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

można zmienić zapytanie, zmuszając sortowania na poziomie kolumny:

SELECT myColumn FROM myTable 
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable 
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable 
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

Ponieważ zmiana tego ustawienia może mieć wpływ na aplikacje i zapytania SQL, najpierw izolowałbym ten test.Z SQL Server 2000 można łatwo uruchomić instrukcję ALTER TABLE, aby zmienić kolejność sortowania konkretnej kolumny, co powoduje, że wielkość liter ma znaczenie. Po pierwsze, należy wykonać następujące zapytanie w celu określenia, co trzeba zmienić go z powrotem do:

EXEC sp_help 'mytable' 

Drugi rekordów powinno zawierać następujące informacje, w domyślnej scenariusz:

COLUMN_NAME Układanie


mycolumn SQL_Latin1_General_CP1_CI_AS

Bez względu na kolumnę "Sortowanie", teraz wiesz, czego potrzebujesz, aby zmienić ją ponownie po ou wprowadzić następujące zmiany, które zmusi wrażliwość obudowy:

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

Jeśli to śruby rzeczy, można go zmienić z powrotem, po prostu wydając nową instrukcji ALTER TABLE (pamiętaj, aby zastąpić mój identyfikator UKLADAJ z jednej znalazłeś poprzednio):

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

Jeśli utkniesz z SQL Server 7.0, można spróbować tego rozwiązania, które mogłyby być trochę bardziej przeboju wydajności (należy uzyskać jedynie wynik dla pierwszego meczu):

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 
2

Najlepszym sposobem, aby pracować z już utworzonych tabel jest to, że idź do SQL Server Query Editor

Typ: sp_help <tablename>

To pokaże strukturę tabeli, patrz dane dla żądanego pola w kolumnie Sortuj.

następnie wpisać zapytanie jak:

SELECT myColumn FROM myTable 
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case' 

To może być inny schemat charakter < SQL_Latin1_General_CP1_CI_AS>, więc lepiej, aby dowiedzieć się dokładnie schematu, który został użyty przeciwko tej kolumny.

6

Serwer SQL określa wielkość liter przez COLLATION.

COLLATION może być ustawiony na różnych poziomach.

  1. poziomie serwera
  2. Database poziomie
  3. Kolumna poziomie
  4. Expression poziomie

Here is the MSDN reference.

Można sprawdzić COLLATION na każdym poziomie, jak wspomniano w Raj More's answer .

Sprawdź Server Sortowanie

SELECT SERVERPROPERTY('COLLATION') 

Sprawdź Database Sortowanie

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 

Sprawdź Kolumna Sortowanie

select table_name, column_name, collation_name 
from INFORMATION_SCHEMA.COLUMNS 
where table_name = @table_name 

Sprawdź wyrażenie Kolacja

Dla poziomu ekspresji COLLATION należy spojrzeć na wyrażenie. :)

Byłby generalnie na końcu wyrażenia, jak w poniższym przykładzie.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI; 

Sortowanie Opis

Dla uzyskania opisu każdej wartości COLLATION spróbować.

SELECT * FROM fn_helpcollations() 

Powinieneś zobaczyć coś takiego.

enter image description here

Zawsze można umieścić WHERE klauzuli do filtrowania i patrz opis tylko dla COLLATION.

Możesz znaleźć listę zestawień here.

0

Jak sprawdzić, czy w bazie danych w programie SQL Server jest rozróżniana wielkość liter?

Możesz skorzystać z poniższego zapytania, które zwraca swoją świadomą baza jest wielkość liter, czy nie, czy jest w rodzaju binarnym (z zerowym wynikiem):

;WITH collations AS (
    SELECT 
     name, 
     CASE 
      WHEN description like '%case-insensitive%' THEN 0 
      WHEN description like '%case-sensitive%' THEN 1 
     END isCaseSensitive 
    FROM 
     sys.fn_helpcollations() 
) 
SELECT * 
FROM collations 
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation')); 

uzyskać więcej czytaj this MSDN information).

Powiązane problemy