接受的答案是誤導性的,但這部分是由於問題本身含糊不清(儘管可能不是故意)。
是的,任何Unicode字符串(即文字與N
,或XML
和N
-prefixed變量前綴),當存儲將隱式轉換爲8位ASCII一個CHAR
/VARCHAR
/TEXT
(不要使用這一個!)領域。 但是,這在許多情況下可能是一個相當重要的區別,只有在U + 0000到U + 007F範圍內的Unicode碼點(即ASCII值0-127)才能保證正確轉換。從U + 0080(即ASCII值128)開始的所有內容都可能會或可能不會進行轉換,具體取決於所插入字段的整理所隱含的代碼頁。如果該排序規則的代碼頁沒有該符號的映射,則代之以?
。
要找出代碼頁是究竟是什麼,首先通過以下兩種查詢發現場的歸類:
SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID(N'table_name');
-- OR:
EXEC sp_help N'table_name';
然後你可以從整理髮現代碼頁,使用:
SELECT COLLATIONPROPERTY('collation_name', 'CodePage');
然後,您可以在幾個網站中的任何一個網站上找到一個圖表,根據該代碼頁碼顯示您映射的內容。
排序規則不是按行排列的,它們是按字段排列的。因此,無論排序規則是什麼,字段都會確定非Unicode字段的字符集(即CHAR
/VARCHAR
/TEXT
)。
所以問題是:在問題中術語「ASCII」是什麼意思?它在技術上僅指7位值(前128個;值0-127),但人們經常使用它來表示任何可以放入單個字節的內容,其中還包括擴展ASCII值(第128個值) 128 - 255),這取決於代碼頁。
對於周圍有VARCHAR
列NVARCHAR
變量和文字的潛在問題(S):指標不會被忽略,但有一定的負面影響,而且變化的基礎上VARCHAR
列的排序規則。
如果列歸類是SQL Server歸類(即以SQL_
開頭,例如SQL_Latin1_General_CP1_CI_AS
),那麼您可以獲得索引掃描,但不能搜索。
但是,如果列歸類是Windows歸類(即不是以SQL_
開頭,例如Latin1_General_100_CI_AS
),那麼您可以獲得索引搜索。
下面的測試顯示了這種行爲:
-- DROP TABLE dbo.VarcharColumnIndex;
CREATE TABLE dbo.VarcharColumnIndex
(
ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT [PK_VarcharColumnIndex] PRIMARY KEY CLUSTERED,
SqlServerCollation VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS,
WindowsCollation VARCHAR(50) COLLATE Latin1_General_100_CI_AS
);
CREATE NONCLUSTERED INDEX [IX_VarcharColumnIndex_SqlServerCollation]
ON dbo.VarcharColumnIndex ([SqlServerCollation]);
CREATE NONCLUSTERED INDEX [IX_VarcharColumnIndex_WindowsCollation]
ON dbo.VarcharColumnIndex ([WindowsCollation]);
INSERT INTO dbo.VarcharColumnIndex ([SqlServerCollation], [WindowsCollation])
VALUES ('a', 'b');
DECLARE @a NVARCHAR(50) = N'a';
SELECT [SqlServerCollation] FROM dbo.VarcharColumnIndex WHERE [SqlServerCollation] = @a;
-- Index Scan
DECLARE @b NVARCHAR(50) = N'b';
SELECT [WindowsCollation] FROM dbo.VarcharColumnIndex WHERE [WindowsCollation] = @b;
-- Index Seek
這表明你沒有使用parametrised查詢? –
不,它使用CakePHP,它只是生成SQL,然後將其作爲未參數化查詢運行它 – icc97
@Martin Smith:前一段時間我們注意到查詢計劃中沒有轉換。 By design http://sqlblog.com/blogs/paul_white/archive/2011/07/19/join-performance-implicit-conversions-and-residuals.aspx – gbn