1

SQL Server 2008 が大文字と小文字を区別しないデータを持つことは可能ですか?たとえば、次のようにするとデータが返されます...

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

mytable.mycolumn の値が「CASE」であるが、外部キーで大文字と小文字が区別される場合は?

4

3 に答える 3

6

大文字と小文字の区別は、データベースの照合設定によって決まります。すべて、比較、外部キーなどに影響します...

ただし、特定の列または列の照合設定を変更して、大文字と小文字を区別して比較することができますが、DB の残りの部分は大文字と小文字を区別しません。例えば:

ALTER COLUMN Name VARCHAR(50)  
COLLATE SQL_Latin1_General_CP1_CS_AS 

これで、 とのすべての比較でName大文字と小文字が区別されます。

大文字と小文字を区別する照合で大文字と小文字を区別しない比較を実行する 1 つの方法は、列ごとの照合キャストをクエリの一部として指定することです。このメソッドを使用してその場で照合を変更する場合は、照合の優先順位についても理解しておく必要があります。クエリの時点で指定されている照合キャストの例を次に示します。

SELECT Name 
FROM MyTable
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll.

列の照合順序は、SSMS のテーブル デザイナーを使用して対話的に変更できます (画像が大きくて申し訳ありません)。

ここに画像の説明を入力

于 2012-05-01T13:50:34.133 に答える
3

外部キーで大文字と小文字を区別する場合は、列で大文字と小文字を区別するように設定します(参照するキーで同じ照合を使用するようにします)。マイケルの答えから照合を借りる:

USE tempdb;
GO

CREATE TABLE dbo.foo 
( 
  [key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS
  PRIMARY KEY
);

CREATE TABLE dbo.bar 
(
  [key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS
  FOREIGN KEY REFERENCES dbo.foo([key])
);

INSERT dbo.foo SELECT 'Bob';
INSERT dbo.foo SELECT 'bOB';
INSERT dbo.foo SELECT 'BOB';
GO

-- fails:
INSERT dbo.bar SELECT 'bob';
GO

-- succeeds:
INSERT dbo.bar SELECT 'Bob';
GO

同じ列に対するクエリで大文字と小文字を区別しないようにする場合は、COLLATE句を指定するだけです(_CI_代わりにを含むことに注意してください_CS_)。

SELECT COUNT(*) FROM dbo.foo 
  WHERE [key] = 'Bob';

----
1

SELECT COUNT(*) FROM dbo.foo 
  WHERE [key]  COLLATE SQL_Latin1_General_CP1_CI_AS = 'Bob';

----
3
于 2012-05-01T14:23:16.493 に答える
0

絶対。選択された SQL Server 照合順序に大きく依存しますが、大文字と小文字が区別されるものとされないものがあります。

SQL Server 照合の選択

于 2012-05-01T13:50:42.453 に答える