web-dev-qa-db-ja.com

SQL Server SQL_Latin1_General_CP1_CI_ASをLatin1_General_CI_ASに安全に変換できますか?

「SQL_Latin1_General_CP1_CI_AS」を使用するいくつかの(古い)列を持つレガシーデータベースがあり、最近の変更では「Latin1_General_CI_AS」が使用されています。

結合には、動作するために追加のCOLLATEステートメントが必要なので、これは苦痛です。

すべてを「Latin1_General_CI_AS」に上げたいです。私が収集できるものから、それらはほぼ同一の照合であり、このプロセス中にデータを失うことはありません...

これが事実かどうかは誰にもわかりますか?

22
Kram

このMSDNフォーラムには詳細情報があります。

http://social.msdn.Microsoft.com/Forums/en-US/sqlgetstarted/thread/196b4586-1338-434d-ba8c-49fa3c9bdeeb/

どの州:

照合順序がSQL_Latin1_General_CP1_CI_ASまたはLatin1_General_CI_ASの場合、ほとんど違いはありませんが、どちらも他よりも速いまたは遅いインスタンスがあります。

Latin1_General_CI_AS:-Latin1-General、大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、幅を区別しない

SQL_Latin1_General_CP1_CI_AS:-Latin1-General、大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、Unicodeデータについては幅を区別しない、非Unicodeデータについてはコードページ1252のSQL Serverソート順52

したがって、私のデータでは、特にデータがa-z0-9のみの場合、違いは見られないはずです。

15
dunos

より完全な答えは次のとおりです。

https://www.olcot.co.uk/revised-difference-between-collat​​ion-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as/

これらの照合順序の主な違いは、文字展開ルールの適用方法です。特定のラテン文字は、複数の文字に展開される場合があります。 SQL_xxxx照合は、非Unicodeテキストで作業する場合、これらの文字拡張を無視する場合がありますが、Unicodeテキストに適用します。結果として、結合、並べ替え、および比較では、1つの照合と他の照合を使用する場合に異なる結果が返される場合があります。

例:

Latin1_General_CI_ASの下にあるこれらの2つのステートメントは、ßssに展開されるため、同じレコードセットを返します。

SELECT * FROM MyTable3 WHERE Comments = 'strasse'
SELECT * FROM MyTable3 WHERE Comments = 'straße'

SQL_Latin1_General_CP1_CI_ASssとは異なる文字として扱われるため、ßを使用する場合、上記のステートメントは異なるレコードを返します。

30
Zarepheth
SELECT * FROM ::fn_helpcollations()
WHERE name IN (
'SQL_Latin1_General_CP1_CI_AS',
'Latin1_General_CI_AS'
)

...与える...

Latin1_General_CI_AS:Latin1-General、大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、幅を区別しない

SQL_Latin1_General_CP1_CI_AS:Latin1-General、大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、幅を区別しないUnicodeデータの場合、SQL Serverのコードページ1252のソート順52は非Unicodeデータの場合

したがって、これから、使用されるコードページが同じ(Latin1-General => 1252)であると推測するため、shouldデータの損失は発生しません。ソート順である-これはおそらく重要ではありません。

5
Will A