İçerdiği veritabanı harmanlamalar

Büyük/küçük harf duyarlı, Aksan duyarlılığı ve kullanılan temel dil gibi metinsel veri sıralama düzeni ve eşitlik semantiği çeşitli özelliklerini etkiler. Bu nitelikleri ifade edilen SQL Serveraracılığıyla veri harmanlama seçim. Alfabe kendilerini daha ayrıntılı bir açıklama için bkz: Harmanlama ve Unicode desteği.

Alfabe uygulamak sadece kullanıcı tablolarda depolanan veri, ancak tüm metin tarafından ele SQL Server, meta, geçici nesneler, değişken isimleri, vb dahil olmak üzere Bu işleme bulunan ve sigara içerdiği veritabanlarında farklıdır. Bu değişikliği çok kullanıcıları etkilemez, ancak yardımcı olur örneği bağımsızlık ve tekdüzelik sağlamak. Ama bu da sorunların yanı sıra, bazı karışıklıklar hem içindeki hem de sigara içerdiği veritabanlarına erişim oturumları için neden olabilir.

Bu konuda değişiklik içeriğini açıklar ve alanlarda nerede değişiklik sorunlara neden olabilir inceliyor.

Sigara içerdiği veritabanları

Tüm veritabanları varsa bir varsayılan harmanlama (hangi oluştururken veya bir veritabanı değiştirme ayarlanabilir. Bu harmanlama veritabanı yanı sıra, veritabanındaki tüm dize sütunlar için varsayılan değer tüm meta verileri için kullanılır. Kullanıcı-ebilmek seçmek birisi belirli sütun için farklı harmanlama kullanarak COLLATEtümcesi.

Örnek 1

Örneğin, biz Pekin çalışıyorsanız bir Çince harmanlama kullanabilirsiniz:

ALTER DATABASE MyDB COLLATE Chinese_Simplified_Pinyin_100_CI_AS;

Şimdi eğer biz bir sütun oluşturmak, kendi varsayılan harmanlama bu Çince harmanlama olacaktır, fakat istersek biz başka birini seçebilirsiniz:

CREATE TABLE MyTable
      (mycolumn1 nvarchar,
      mycolumn2 nvarchar COLLATE Frisian_100_CS_AS);
GO
SELECT name, collation_name
FROM sys.columns
WHERE name LIKE 'mycolumn%' ;
GO

Sonuç kümesi buradadır.

name            collation_name
--------------- ----------------------------------
mycolumn1       Chinese_Simplified_Pinyin_100_CI_AS
mycolumn2       Frisian_100_CS_AS

Bu nispeten basit görünüyor, ama çeşitli sorunlar ortaya çıkmaktadır. Bir sütunun harmanlama veritabanı tablo oluşturulduğunda bağlı olduğundan, geçici tablolar içinde saklanan kullanımı ile sorunları ortaya tempdb. Harmanlama tempdb genellikle veritabanı harmanlamayı eşleşmesi gerekmez örneğinin harmanlama eşleşir.

Örnek 2

Örneğin, yukarıdaki (Çince) veritabanı ne zaman düşünün bir örneğiyle kullanılan bir Latin1_General harmanlama:

CREATE TABLE T1 (T1_txt nvarchar(max)) ;
GO
CREATE TABLE #T2 (T2_txt nvarchar(max)) ;
GO

İlk bakışta, bu iki tablo gibi aynı şemaya sahip oldukları, ancak alfabe veritabanları farklı başlangıç değerleri aslında bağdaşmaz arayın:

SELECT T1_txt, T2_txt
FROM T1 
JOIN #T2 
    ON T1.T1_txt = #T2.T2_txt

Sonuç kümesi buradadır.

Msg 468, düzey 16, State 9, satır 2

"Latin1_General_100_CI_AS_KS_WS_SC" arasında harmanlama çakışma çözülemiyor ve Chinese_Simplified_Pinyin_100_CI_AS" eşit işlem.

Biz-ebilmek saptamak bu geçici tabloyu açıkça harmanlama tarafından. SQL ServerBu sağlayarak biraz kolaylaştırır DATABASE_DEFAULTiçin anahtar kelime COLLATEtümcesi.

CREATE TABLE T1 (T1_txt nvarchar(max)) ;
GO
CREATE TABLE #T2 (T2_txt nvarchar(max) COLLATE DATABASE_DEFAULT);
GO
SELECT T1_txt, T2_txt
FROM T1 
JOIN #T2 
    ON T1.T1_txt = #T2.T2_txt ;

Bu artık hatasız çalışır.

Biz de harmanlama bağlı davranış değişkenleri ile görebilirsiniz. Aşağıdaki işlevi göz önünde bulundurun:

CREATE FUNCTION f(@x INT) RETURNS INT
AS BEGIN 
      DECLARE @I INT = 1
      DECLARE @İ INT = 2
      RETURN @x * @i
END;

Bu oldukça kendine özgü bir işlevdir. Duyarlı bir alfabe düzeni, ya ben ya da @ İ @, @ i in return yantümcesini için bağlanılamıyor. Büyük küçük harf duyarsız bir Latin1_General harmanlama @ i I bağlar ve işlev 1 değerini döndürür. Ama bir duyarlı Türkçe alfabe düzeni içinde @ İ için @ i bağlar ve 2 işlev verir. Bu hamle ile farklı harmanlamalar örnekleri arasında bir veritabanı üzerinde hasara.

İçerdiği veritabanları

İçerdiği veritabanları tasarım amacı onları kendine yeten, örneğin bağımlılık olduğundan ve tempdbalfabe kopmuş. Bunu yapmak için içerdiği veritabanlarında katalog harmanlamayı kavramını tanıtmak. Katalog harmanlama sistem meta verileri ve geçici nesneler için kullanılır. Ayrıntılar aşağıda verilmektedir.

İçerdiği veritabanında Katalog harmanlama Latin1_General_100_CI_AS_WS_KS_SC. Bu harmanlama tüm örneklerini içerilen tüm veritabanları için aynıdır SQL Serverve değiştirilemez.

Veritabanı harmanlama korunur, ancak yalnızca kullanıcı verileri için varsayılan harmanlama olarak kullanılır. Varsayılan olarak, veritabanı harmanlama eşittir modeli veritabanı harmanlama, ancak kullanıcı tarafından değiştirilebilir bir CREATEya ALTER DATABASEkomut olarak sigara içerdiği veritabanlarında.

Yeni bir anahtar kelime CATALOG_DEFAULT, kullanılabilir COLLATEtümcesi. Bu meta verileri hem de bulunan ve sigara içerdiği veritabanları geçerli harmanlama kısayol olarak kullanılır. Yani sigara bulunan bir veritabanında CATALOG_DEFAULTmeta veri veritabanı harmanlama harmanlanmış beri geçerli veritabanı harmanlama döndürür. Katalog harmanlama eşleşmiyor kullanıcı veritabanı harmanlama değiştirebilirsiniz içerdiği veritabanı, bu iki değerden farklı olabilir.

Hem sigara içerdiği hem de içerdiği veritabanlarında çeşitli nesnelerin davranışını bu tabloda özetlenmiştir:

Öğe

Veritabanı yer

İçerdiği veritabanı

Kullanıcı verileri (varsayılan)

DATABASE_DEFAULT

DATABASE_DEFAULT

Geçici veri (varsayılan)

TempDB harmanlama

DATABASE_DEFAULT

Meta veri

DATABASE_DEFAULT / CATALOG_DEFAULT

CATALOG_DEFAULT

Geçici meta verileri

tempdb harmanlama

CATALOG_DEFAULT

Değişkenleri

Örneğinin harmanlama

CATALOG_DEFAULT

Goto etiket

Örneğinin harmanlama

CATALOG_DEFAULT

İmleç adları

Örneğinin harmanlama

CATALOG_DEFAULT

Biz daha önce açıklanan tablo örneği temp, biz bu harmanlama davranış açık bir gereksinimini ortadan kaldıran görebilirsiniz COLLATEyan tümcesinde en geçici tablo kullanır. Veritabanı ve örnek alfabe farklı olsa bile bulunan bir veritabanında bu kodu hatasız, şimdi çalıştırır:

CREATE TABLE T1 (T1_txt nvarchar(max)) ;
GO
CREATE TABLE #T2 (T2_txt nvarchar(max));
GO
SELECT T1_txt, T2_txt
FROM T1 
JOIN #T2 
    ON T1.T1_txt = #T2.T2_txt ;

Bu çalışır çünkü hem T1_txtve T2_txtiçerdiği veritabanının veritabanı harmanlama harmanlanmış.

İçerilen ve Uncontained içerikler arasında geçiş

İçerdiği veritabanının bir oturumda kapsanan kaldığı sürece bağlı veritabanı içinde kalmalıdır. Bu durumda davranışı çok basittir. Ama bir oturum arasında kesişsin bulunan ve iki kural kümesini köprü gerekir çünkü sigara içerdiği kapsamları davranışı daha karmaşık olur. Kullanıcı olabilir çünkü bu kısmen bulunan bir veritabanında olabilir USEbaşka bir veritabanına. Bu durumda, harmanlama kuralları farkı aşağıdaki ilke tarafından gerçekleştirilir.

  • Bir harmanlama davranışı toplu başladığı veritabanı tarafından belirlenir.

Bu karar bir ilk de dahil olmak üzere tüm komutları yayınlanmadan önce yapıldığını Not USE. Yani toplu içerdiği veritabanı, ancak ilk komut başlar ise, bir USEsigara bulunan bir veritabanına içerdiği harmanlama davranış hala toplu işlem için kullanılacak. Bu göz önüne alındığında, bir değişkenin başvurusu, örneğin, birden çok olası sonucu olabilir:

  • Başvuru, tam bir eşleşme bulabilirsiniz. Bu durumda, başvuru hatasız çalışacak.

  • Başvuru geçerli harmanlama eşleşen bir bulamayabilir nerede oldu önce. Bu değişken yok, düz-se bile görünüşte oluşturulduğu bildiren bir hata yükseltmek edecektir.

  • Başvuru, başlangıçta ayrı birden fazla eşleşme bulabilirsiniz. Bu da bir hata yükseltmek.

Biz bu birkaç örneklerle göstermek. Biz adlı kısmen yer alan bir veritabanı için bu kabul MyCDBile kendi veritabanı harmanlama ayarlamak için varsayılan harmanlama, Latin1_General_100_CI_AS_WS_KS_SC. Biz örneğinin harmanlama olduğunu varsayalım Latin1_General_100_CS_AS_WS_KS_SC. İki alfabe yalnızca büyük/küçük harf duyarlılığı farklı.

Örnek 1

Aşağıdaki örnekte, nereye başvuru tam bir eşleşme bulur böyle gösterilmektedir.

USE MyCDB;
GO

CREATE TABLE #a(x int);
INSERT INTO #a VALUES(1);
GO

USE master;
GO

SELECT * FROM #a;
GO

Results:

Sonuç kümesi buradadır.

x
-----------
1

Bu durumda, tespit # a bağlamalar hem duyarlı Katalog harmanlama duyarlı örneğinin harmanlama ve kod çalışır.

Örnek 2

Burada referans bulmak bir maç içinde geçerli harmanlama durumda aşağıdaki örnekte gösterilmektedir nerede oldu önce.

USE MyCDB;
GO

CREATE TABLE #a(x int);
INSERT INTO #A VALUES(1);
GO

Burada, bağlar a # # için bir harf büyüklüğüne duyarsız varsayılan harmanlama ve INSERT eserler,

Sonuç kümesi buradadır.

(1 row(s) affected)

Ama eğer biz komut devam...

USE master;
GO

SELECT * FROM #A;
GO

Biz bağlamak için de duyarlı örneğinin harmanlama # a çalışılırken bir hata olsun;

Sonuç kümesi buradadır.

Msg 208, düzey 16, State 0, satır 2

Geçersiz nesne adı '# a'.

Örnek 3

Aşağıdaki örnekte, nereye başvuru başlangıçta ayrı birden fazla eşleşme bulur böyle gösterilmektedir. Önce biz başlamak tempdb (bizim örnek olarak aynı büyük küçük harf duyarlı harmanlamayı sahip) ve aşağıdaki deyimleri yürütmek.

USE tempdb;
GO

CREATE TABLE #a(x int);
GO
CREATE TABLE #A(x int);
GO
INSERT INTO #a VALUES(1);
GO
INSERT INTO #A VALUES(2);
GO

Bu başarılı, tabloları bu harmanlama farklı olduğundan:

Sonuç kümesi buradadır.

(1 row(s) affected)
(1 row(s) affected)

Ancak, biz bizim içerdiği veritabanına taşımak, biz artık bu tablolara bağlayabilirsiniz bulabilirsiniz.

USE MyCDB;
GO
SELECT * FROM #a;
GO

Sonuç kümesi buradadır.

Msg 12800, düzey 16, State 1, satır 2

Geçici tablo adı başvurusunu ' # bir ' belirsiz ve çözülemiyor. Olası adaylar ' # bir ' ve '# a'.

Sonuç

İçerdiği veritabanları harmanlama davranışını ustaca o sigara içerdiği veritabanlarında farklıdır. Bu davranış genellikle örneği-bağımsızlık ve kolaylık sağlayan faydalıdır. Özellikle hem içindeki hem de sigara içerdiği veritabanlarında oturum eriştiğinde, bazı kullanıcılar, sorunlarla karşılaşabilirsiniz.

Ayrıca bkz.

Kavramlar

İçerdiği veritabanları

Diğer Kaynaklar

Collations and SQL Server Client Applications