SQL Server檢查是否區分大小寫?

如何檢查SQL Server中的數據庫是否區分大小寫? 我以前一直在運行查詢:

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

但是我正在尋找其他方式,因為這實際上在過去給了我很多問題。

編輯-更多信息:現有產品具有許多預寫的存儲過程。 在存儲過程中@test != @TEST取決于服務器本身的敏感度。 因此,我要尋找的是檢查服務器靈敏度的最佳方法。

asked 2020-02-22T11:39:00Z
7個解決方案
71 votes

可以在各種級別上設置排序規則:

  1. 服務器
  2. 數據庫

因此可以领救济金的游戏,您可以在不區分大小寫的數據庫中包含一個區分大小寫的列。 我還沒有遇到過可以針對單個數據列的大小寫敏感性進行業務案例研究的情況,但是我想可以。

檢查服務器排序規則

SELECT SERVERPROPERTY('COLLATION')

檢查數據庫整理

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

檢查列排序規則

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
answered 2020-02-22T11:39:40Z
33 votes

如果使用默認排序規則選項安裝了SQL Server,則可能會發現以下查詢返回相同的結果:

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' 

您可以通過在列級別強制排序規則來更改查詢:

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') 

由于更改此設置會影響應用程序和SQL查詢,因此我將首先隔離此測試。 在SQL Server 2000中,您可以輕松地運行ALTER TABLE語句來更改特定列的排序順序,強制其區分大小寫。 首先,執行以下查詢以確定將其更改回的內容:

EXEC sp_help 'mytable' 

在默認情況下,第二個記錄集應包含以下信息:

Column_Name排序規則


列SQL_Latin1_General_CP1_CI_AS

無論“歸類”列返回什么,現在您都知道在進行以下更改后需要將其更改回什么,這將強制區分大小寫:

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' 

如果這樣做搞砸了,您可以通過發出新的ALTER TABLE語句(將我的COLLATE標識符替換為之前找到的標識符)簡單地將其改回:

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

如果您仍然使用SQL Server 7.0,則可以嘗試以下解決方法,這可能會對性能造成一些影響(您應該只為FIRST匹配項獲得結果):

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' 
answered 2020-02-22T11:40:37Z
7 votes

SQL Server通過COLLATION確定是否區分大小寫。

WHERE可以設置為各種級別。

  1. 服務器級別
  2. 數據庫級
  3. 列級
  4. 表達水平

這是MSDN參考。

正如Raj More的回答中所述,可以在每個級別檢查WHERE

檢查服務器排序規則

SELECT SERVERPROPERTY('COLLATION')

檢查數據庫整理

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

檢查列排序規則

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

檢查表達式排序規則

對于表達式級別WHERE,您需要查看表達式。 :)

如下面的示例所示可以领救济金的游戏,它通常位于表達式的末尾。

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

歸類說明

為了獲得每個WHERE值的描述,請嘗試此。

SELECT * FROM fn_helpcollations()

而且您應該看到類似這樣的內容。

enter image description here

您始終可以放置WHERE子句進行過濾,并且僅查看COLLATION的描述。

您可以在此處找到歸類列表。

answered 2020-02-22T11:42:16Z
4 votes

您對整理感興趣。 您可以根據以下代碼片段構建一些東西:

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

更新資料
根據您的編輯-如果@test@TEST曾經可以引用兩個不同的變量,則不是SQL Server。 如果您發現相同變量不等于其自身的問題,請檢查該變量是否為NULL,因為NULL = NULL返回`false。

answered 2020-02-22T11:42:45Z
2 votes

處理已經創建的表的最佳方法是,轉到Sql Server查詢編輯器

類型:SQL_Latin1_General_CP1_CI_AS

這將顯示表的結構,在COLLATE列下查看所需字段的詳細信息。

然后像這樣輸入查詢:

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

可能是不同的字符模式<SQL_Latin1_General_CP1_CI_AS>,因此找出針對該列使用的確切模式。

answered 2020-02-22T11:43:23Z
1 votes

如何檢查SQL Server中的數據庫是否區分大小寫?

您可以使用下面的查詢返回您所通知的數據庫是否區分大小寫或為二進制排序(結果為空):

;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'));

有關更多信息,請閱讀此MSDN信息;)。

answered 2020-02-22T11:43:52Z
-2 votes

SQL Server不區分大小寫。 SELECT * FROM SomeTableSeLeCT * frOM soMetaBLe相同。

answered 2020-02-22T11:44:12Z
translate from