もっと

SQLServerテーブルのフィールドコンテンツを更新するときのASCIIエンコードエラー

SQLServerテーブルのフィールドコンテンツを更新するときのASCIIエンコードエラー


Unicodeエラーに関する投稿やブログの説明がたくさんあることは知っていますが、それでも私の特定のケースでそれを処理することができません。これが私の問題です。ArcPadで編集されたシェープファイルのフィールドコンテンツを使用して、SQLServerテーブルのレコードを更新するPythonスクリプトを作成しています。

私は使用しますarcpy.da.UpdateCursor既存のレコードを更新します。

入れました#-*-コーディング:cp1252-*-フランス語の文字を扱うときのスクリプトの上に。そうするだけで、ASCIIエンコードエラーが発生します。

'ascii'コーデックは位置0-1の文字をエンコードできません:序数が範囲内にありません(128)

入れてみましたuフィールドコンテンツの前:

…witharcpy.da.UpdateCursor(DBtable、DBFields、where_clause)as DBCur:for DBrow in DBCur:…DBrow [8] = u "{}-{}:{}"。format(DBrow [8]、date、AProw [8])#AProwは、シェープファイルを読み取るSearchCursorから取得されます。

その後、テキストコンテンツを含むメッセージを印刷できますが、エラーメッセージは返されませんが、すべての文字が置き換えられます(???4???5????????>???5???私のデータベースフィールドで)。

強調文字または句読文字はフィールドに含めることができるため(フリーテキストのコメントフィールドがあります)、ASCII以外の文字をすべてチェックして置き換える必要はありません。

私はArcGIS10.2.2を使用しており、シェープファイルはArcPad 10.2で編集されており、データベースはSQL Server 2008R2です。

何が足りないのですか?

編集:これは、宛先データベースがSQLServerの場合にのみ発生します。ファイルgdbに問題はありません。 SQLServerテーブルにはすでに非ASCII文字が含まれていることを追加する必要があります。


最後に、コードに次のすべての変更を加えることで解決策を見つけました。

  • 使用するarcpy.ArcSDESQLExecute()それ以外のarcpy.daカーソルの挿入/更新テーブルを更新/入力する(両方の操作を実行する必要があり、両方のタイプのカーソルがすべての状況で実際に機能するとは限りませんでした)。

  • 使用する#-*-コーディング:utf8-*-スクリプトの冒頭で、とにかく良い習慣になるはずです(#-*-コーディング:cp1252-*-メッセージにアクセントを付けることはできますが、データベーステーブルの編集には使用できません)。メッセージのアクセントが置き換えられましたが、データベースの編集は機能します。

  • SQLリクエスト内で一重引用符が文字列区切り文字として認識されるという問題もありました。これに対処するために、私はそれらを置き換える必要がありました ダブル 一重引用符。

だから今私のコードは次のようになります:

new_comment = "{}-{}:{}"。format(DBrow [8] .replace( "'"、 "" ").encode(' utf-8 ')、date、AProw [8] replace("' "、" "").encode( 'utf-8'))#DBrow [8]はテーブルにすでに存在するコメントであり、AProw [8]はArcPadで編集されたシェープファイルからの新しいコメントです…sde_conn = arcpy.ArcSDESQLExecute (DB)sql = "update {} set {} = '{}"。format(DBtable、DBcomment_field、new_comment)

いつの日か、この種のUnicode / SQLServerの頭痛の種に直面する人の助けになることを願っています。


NULLはありませんが、&ldquoUTF8&rdquoをエンコードするための無効なバイトシーケンス:0x00

過去8時間、「mysqldump --compatible = postgresql」の出力をPostgreSQL8.4.9にインポートしようとしました。この特定の問題について、ここと他の場所で少なくとも20の異なるスレッドを読みましたが、見つかりませんでした。うまくいく本当の使える答え。

宛先としてのPostgreSQL8.4.9サーバー

'psql -U rt_user -f foo'を使用してデータをロードすると、レポートが作成されます(これらの多く、ここに1つの例があります)。

以下によると、入力ファイルにNULL(0x00)文字はありません。

同様に、Perlを使用した別のチェックでは、NULLは示されません。

エラーの「ヒント」に記載されているように、「client_encoding」を「UTF8」に設定するためのあらゆる方法を試しましたが、成功しましたが、問題の解決には効果がありません。

「Hoyleによる」正解を除いて、それは聞くのが素晴らしいでしょう、そして私がこのめったに参照されないデータのために非ASCII文字を保存することを本当に気にしないことを知っているので、あなたはどんな提案がありますか?

更新:インポート時に同じダンプファイルのASCIIのみのバージョンで同じエラーが発生します。本当に気が遠くなるような:

問題のテーブルの1つは、次のように定義されています。

DBスキーマのどの部分のタイプも変更する自由がありません。そうすることは、ソフトウェアの将来のアップグレードなどを壊す可能性があります。

考えられる問題の列は、「text」タイプの「content」です(おそらく他のテーブルの他の列も同様です)。以前の調査からすでに知っているように、PostgreSQLは「テキスト」値にNULLを許可しません。ただし、sedとPerlの両方でNULL文字が表示されない上記を参照してください。さらに、ダンプファイル全体からすべての非ASCII文字を削除しますが、それでもバーフを表示します。


1回答1

SQL Serverは、どのような状況でもUTF-8を格納しません。 NVARCHAR(NCHARとNTEXTを含むが、NTEXTは使用しない)を介してUTF-16リトルエンディアン(LE)とXMLを取得するか、またはVARCHAR(CHARとTEXTを含む)を介してコードページに基づく8ビットエンコーディングを取得します。 、ただしTEXTは使用しないでください)。

ここでの問題は、コードがその0x82文字を誤って翻訳していて、UTF-8だと思っていることですが、そうではありません。値が0x82のUTF-8「文字」はありません。そのため、「不明」/置換記号「 」が表示されます。 0x82のシングルバイトに文字がないことを示す次のUTF-8表を参照してください。

O.P.が述べているように、問題の列の照合はSQL_Latin1_General_CP1_CI_ASです。これは、8ビットエンコーディングがWindows Latin 1(ANSI)であるコードページ1252を使用していることを意味します。そして、そのチャート(文字名があるので一番下のチャートまでスクロールダウン)の値0x82(「コードポイント」列で「82」を探します)をチェックすることは、実際にはSSMSに表示される単一のLow-9引用符です。その文字は、UTF-8では、3バイトのシーケンスです:E2 809A。

これが意味することは、Pythonコードで、SQL Server接続のクライアントエンコーディングをコードページ1252に設定するか、返された文字列のエンコーディングを変更/変換する必要があるということです。 から コードページ1252 UTF-8。

もちろん、これがWebページに表示されている場合は、 できる ページの宣言された文字セットをWindows-1252に変更しますが、UTF-8文字がすでに存在する場合は、ページ上の他の文字と干渉する可能性があります。


Unicodeを介したSQLインジェクション

私のチームは現在、ソフトウェアにMS SQLServerでASP.NETを使用しています。セキュリティが重要になったのは私が始めてからで、どこにでも注入の脆弱性があります。

現在、OracleおよびMS SQLと統合されているため、ビジネス上の決定は、パラメーター化されたクエリを使用することではありませんでした。もちろんこれは問題でした。

パラメータのホワイトリストに加えて検索と置換を実装することで、この問題が大幅に軽減されました。

私の唯一の問題は、SQLインジェクションの原因であるUnicodeやその他のエンコーディングについてたくさん読んだことです。私はこれをよく理解していません。現在、次のようにすべてをサニタイズしています。

ユニコード/エンコードされたインジェクションを使用できる例、またはこの正規表現がSQLインジェクションを防ぐことができない単純な例を誰かが持っていますか?

標準のSQLインジェクションに関連する回答がないようにしてください。私はすでにこれに精通しています。また、文字列のサニタイズを使用しないと言って投稿を停止してください。クライアントがOracleを使用している場合にODP.NETを使用するためのロジックを構築しながら、すべてのクエリをADO.NETでパラメータ化されたクエリにシフトするリソースは社内にありません。 OWASPは、パラメーター化に問題がない場合に文字のホワイトリストを使用することに言及しているため、正規表現の場合と同様に、許可される文字はごくわずかです。これは愚かなので、私はキャラクターをブラックリストに載せていません。

当社が保持するデータに準拠する必要はありません。コンテンツが変更された場合は悪夢になるため、セキュリティはデータベースの整合性のためのものです。

私たちのソフトウェアは、非常に大規模なクラウドアプリケーションCMSとDMSを1つにまとめたもので、ソフトウェアの99%が内部で使用され、少数のみが外部であり、ドキュメントの公開レビューとコメントにのみ使用されます。

Unicodeインジェクションについての私の新しい理解から。これは、データがクエリに配置される前にエンコードされている場合にのみ発生する可能性があるため、Unicodeインジェクションは、データがグローバル化されているアプリケーションでのみ実際に発生します。上記のサニタイズの後、生の文字列フィールドを文字列クエリに直接渡します。

Unicodeは私の状況では適用されないという私の主張を裏付けることができる注射の専門家からの回答のみをお願いできますか?


4回答4

コメントからわかるように、問題はテーブルやSQLCMDが特殊文字をインポートする方法に正確にはありません。通常、問題のあるインポートは、スクリプト自体の形式に関連しています。

Management Studio自体は、特定のエンコーディングで保存するオプションを提供します。これにより、将来問題が解決するはずです。初めてファイルを保存するとき(または名前を付けて保存を使用するとき)は、の近くにある小さな矢印をクリックする必要があります。 保存する ボタン、オプションを使用するには エンコーディングで保存.

デフォルトでは、ファイルをに保存します 西ヨーロッパ(1252)。特殊文字がある場合は常にUTF8を使用します(ただし、他の制限付きエンコーディングが適している可能性があります)。これは通常、UTF8が最速の修正であるためです。

(写真から)SSMSを使用しているかどうかわからないため、独自のエディターにファイルを別のエンコードで保存するオプションがあることを確認してください。そうでない場合は、通常、スマートエディター(Notepad ++で既に試したように)でファイルを変換できます。ただし、ワイドエンコーディングからナローエンコーディングに変換してからワイドエンコーディングに戻す場合(たとえば、UnicodeからANSIに、そしてUnicodeに戻す場合)は機能しない可能性があります。

私が今学んだもう1つのオプションは、sqlcmdのドキュメントにあります。 sqlcmdのコードページをファイルエンコーディングのコードページと一致するように設定する必要があります。 UTF-8の場合、コードページは65001なので、次のようにします。

SQLCMD-S。 MSSQLSERVER08 -V 17 -E -i%

dp0 databaseCreationLog.log -f 65001

この種のことは、あなたに言わずに多くのことが行われるため、非常に注意が必要です。

私が最初にすることは、sqlcmdを使用して文字列を表示することです。 cmd.exeウィンドウに正しく表示される場合、それは1つの有用な事実です。次に、文字列をvarbinaryに変換する行を選択して、実際にどのバイトが存在するかを確認します。おもう 地図作成 0x636172746f67726166c3ad61として表示されます。ここで、アクセント付きの「i」は、その文字のUTF-8エンコーディングであるバイトc3adで表されます。現代スペイン語の列(Windows 1252)にUTF-8を含めるのは良くありません。その文字のWindows1252のバイト値は、10進数の237(16進数のED)です。

列に誤ってエンコードされたデータが含まれている場合、エラーはその挿入方法にあります。おそらく、文字列定数の先頭のNを削除すると(N'string 'はSQLServerにUnicode文字列を生成するように指示しますが、プレーンな' string 'は文字がクライアントのエンコーディングを使用することを示します)、Unicodeの代わりに現代スペイン語を挿入します。

列に正しくエンコードされたデータが含まれている場合は、GUI表示にバグが見つかったと思います。

sqlcmdでデータを正しく挿入できない場合(先頭がNかどうか)、Microsoftに文句を言う必要があります。その場合、列に格納されているバイトを(convert(colname as varbinary)を使用して)表示できることが、何が問題になっているのかを説明するために重要になります。


照合用語

照合

照合は、データセット内の各文字を表すビットパターンを指定します。照合は、データを並べ替えて比較するルールも決定します。 SQL Serverは、異なる照合を持つオブジェクトを単一のデータベースに格納することをサポートしています。 Unicode以外の列の場合、照合設定はデータのコードページと表現できる文字を指定します。 Unicode以外の列間で移動するデータは、ソースコードページから宛先コードページに変換する必要があります。

Transact-SQLステートメントの結果は、異なる照合設定を持つ異なるデータベースのコンテキストでステートメントが実行されると異なる場合があります。可能であれば、組織に標準化された照合を使用してください。このように、すべての文字またはUnicode式で照合を指定する必要はありません。照合とコードページの設定が異なるオブジェクトを操作する必要がある場合は、クエリをコーディングして、照合の優先順位のルールを検討してください。詳細については、「照合の優先順位(Transact-SQL)」を参照してください。

照合に関連するオプションは、大文字と小文字の区別、アクセントの区別、かなの感度、幅の感度、および異体字セレクターの感度です。 SQL Server 2019(15.x)では、UTF-8エンコーディングの追加オプションが導入されています。

これらのオプションは、照合名に追加することで指定できます。たとえば、照合 Japanese_Bushu_Kakusu_100_CS_AS_KS_WS_UTF8 大文字と小文字、アクセント、かな、幅、UTF-8でエンコードされています。別の例として、照合 Japanese_Bushu_Kakusu_140_CI_AI_KS_WS_VSS 大文字と小文字を区別しない、アクセントを区別しない、かなを区別する、幅を区別する、異体字セレクターを区別する、非Unicodeエンコーディングを使用します。

これらのさまざまなオプションに関連する動作を次の表に示します。

1バイナリまたはバイナリコードポイントが選択されている場合、大文字と小文字を区別する(_CS)、アクセントを区別する(_AS)、カナを区別する(_KS)、および幅を区別する(_WS)オプションは使用できません。

照合オプションの例

各照合は一連の接尾辞として組み合わされ、大文字と小文字、アクセント、幅、またはかなの感度を定義します。次の例では、サフィックスのさまざまな組み合わせに対するソート順の動作について説明します。

Windows照合接尾辞 並べ替え順序の説明
_BIN 1 バイナリソート
_BIN2 1、2 バイナリコードのポイントソート順
_CI_AI 2 大文字と小文字を区別しない、アクセントを区別しない、かなを区別しない、幅を区別しない
_CI_AI_KS 2 大文字と小文字を区別しない、アクセントを区別しない、かなを区別する、幅を区別しない
_CI_AI_KS_WS 2 大文字と小文字を区別しない、アクセントを区別しない、かなを区別する、幅を区別する
_CI_AI_WS 2 大文字と小文字を区別しない、アクセントを区別しない、かなを区別しない、幅を区別する
_CI_AS 2 大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、幅を区別しない
_CI_AS_KS 2 大文字と小文字を区別しない、アクセントを区別する、かなを区別する、幅を区別しない
_CI_AS_KS_WS 2 大文字と小文字を区別しない、アクセントを区別する、かなを区別する、幅を区別する
_CI_AS_WS 2 大文字と小文字を区別しない、アクセントを区別する、かなを区別しない、幅を区別する
_CS_AI 2 大文字と小文字を区別、アクセントを区別しない、かなを区別しない、幅を区別しない
_CS_AI_KS 2 大文字と小文字を区別、アクセントを区別しない、かなを区別する、幅を区別しない
_CS_AI_KS_WS 2 大文字と小文字を区別、アクセントを区別しない、かなを区別する、幅を区別する
_CS_AI_WS 2 大文字と小文字を区別、アクセントを区別しない、かなを区別しない、幅を区別する
_CS_AS 2 大文字と小文字を区別、アクセントを区別、かなを区別しない、幅を区別しない
_CS_AS_KS 2 大文字と小文字を区別する、アクセントを区別する、かなを区別する、幅を区別しない
_CS_AS_KS_WS 2 大文字と小文字を区別、アクセントを区別、かなを区別、幅を区別
_CS_AS_WS 2 大文字と小文字を区別、アクセントを区別、かなを区別しない、幅を区別する

1バイナリまたはバイナリコードポイントが選択されている場合、大文字と小文字を区別する(_CS)、アクセントを区別する(_AS)、カナを区別する(_KS)、および幅を区別する(_WS)オプションは使用できません。

2 UTF-8オプション(_UTF8)を追加すると、UTF-8を使用してUnicodeデータをエンコードできます。詳細については、この記事の「UTF-8サポート」セクションを参照してください。

照合セット

SQL Serverは、次の照合セットをサポートしています。

Windowsの照合

Windows照合は、関連付けられたWindowsシステムロケールに基づく文字データを格納するためのルールを定義します。 Windows照合の場合、Unicodeデータの場合と同じアルゴリズムを使用して、非Unicodeデータの比較を実装できます。基本のWindows照合ルールは、辞書の並べ替えを適用するときに使用するアルファベットまたは言語を指定します。ルールは、非Unicode文字データを格納するために使用されるコードページも指定します。 Unicodeと非Unicodeの両方の並べ替えは、特定のバージョンのWindowsでの文字列比較と互換性があります。これにより、SQL Server内のデータ型間で一貫性が提供され、開発者はSQLServerで使用されているのと同じルールを使用してアプリケーション内の文字列を並べ替えることができます。詳細については、「Windows照合名(Transact-SQL)」を参照してください。

バイナリ照合

バイナリ照合は、ロケールとデータ型によって定義されたコード化された値のシーケンスに基づいてデータを並べ替えます。大文字と小文字が区別されます。 SQL Serverのバイナリ照合は、使用されるロケールとANSIコードページを定義します。これにより、バイナリの並べ替え順序が適用されます。バイナリ照合は比較的単純であるため、アプリケーションのパフォーマンスを向上させるのに役立ちます。 Unicode以外のデータ型の場合、データ比較は、ANSIコードページで定義されているコードポイントに基づいています。 Unicodeデータ型の場合、データ比較はUnicodeコードポイントに基づいています。 Unicodeデータ型でのバイナリ照合の場合、ロケールはデータの並べ替えでは考慮されません。例えば、 Latin_1_General_BINJapanese_BIN Unicodeデータで使用すると、同じ並べ替え結果が得られます。詳細については、「Windows照合名(Transact-SQL)」を参照してください。

SQL Serverには、次の2種類のバイナリ照合があります。

レガシー 置き場 Unicodeデータに対して不完全なコードポイント間の比較を実行した照合。これらのレガシーバイナリ照合では、最初の文字をWCHARとして比較し、続いてバイトごとに比較しました。 BIN照合では、最初の文字のみがコードポイントに従ってソートされ、残りの文字はバイト値に従ってソートされます。

新しい BIN2 純粋なコードポイント比較を実装する照合。 BIN2照合では、すべての文字がコードポイントに従ってソートされます。 Intelプラットフォームはリトルエンディアンアーキテクチャであるため、Unicodeコード文字は常にバイトスワップで格納されます。

SQLServerの照合

SQL Serverの照合(SQL_ *)は、以前のバージョンのSQLServerとの並べ替え順序の互換性を提供します。 Unicode以外のデータの辞書の並べ替え規則は、Windowsオペレーティングシステムによって提供される並べ替えルーチンと互換性がありません。ただし、Unicodeデータの並べ替えは、特定のバージョンのWindows並べ替えルールと互換性があります。 SQL Serverの照合では、非UnicodeデータとUnicodeデータに対して異なる比較ルールが使用されるため、基になるデータ型に応じて、同じデータの比較に対して異なる結果が表示されます。詳細については、「SQL Server照合名(Transact-SQL)」を参照してください。

SQL Serverのセットアップ中、デフォルトのインストール照合設定は、オペレーティングシステム(OS)のロケールによって決定されます。サーバーレベルの照合は、セットアップ中、またはインストール前にOSロケールを変更することで変更できます。下位互換性の理由から、デフォルトの照合は、特定の各ロケールに関連付けられている利用可能な最も古いバージョンに設定されています。したがって、これが常に推奨される照合であるとは限りません。 SQL Serverの機能を最大限に活用するには、Windowsの照合を使用するように既定のインストール設定を変更します。たとえば、OSロケール「English(United States)」(コードページ1252)の場合、セットアップ中のデフォルトの照合は次のようになります。 SQL_Latin1_General_CP1_CI_AS、そしてそれは最も近いWindows照合の対応物に変更することができます、 Latin1_General_100_CI_AS_SC.

SQL Serverの英語のインスタンスをアップグレードする場合、SQL Serverの既存のインスタンスとの互換性のために、SQL Serverの照合(SQL_ *)を指定できます。 SQL Serverのインスタンスのデフォルトの照合はセットアップ中に定義されるため、次の条件が当てはまる場合は、照合設定を慎重に指定してください。

  • アプリケーションコードは、以前のSQLServer照合の動作によって異なります。
  • 複数の言語を反映する文字データを保存する必要があります。

照合レベル

照合の設定は、SQLServerのインスタンスの次のレベルでサポートされています。

サーバーレベルの照合

デフォルトのサーバー照合はSQLServerのセットアップ中に決定され、システムデータベースとすべてのユーザーデータベースのデフォルトの照合になります。

次の表は、WindowsおよびSQL言語コード識別子(LCID)を含む、オペレーティングシステム(OS)ロケールによって決定されるデフォルトの照合指定を示しています。

Windowsロケール Windows LCID SQL LCID デフォルトの照合
アフリカーンス語(南アフリカ) 0x0436 0x0409 Latin1_General_CI_AS
アルバニア語(アルバニア) 0x041c 0x041c アルバニア語_CI_AS
アルザス語(フランス) 0x0484 0x0409 Latin1_General_CI_AS
アムハラ語(エチオピア) 0x045e 0x0409 Latin1_General_CI_AS
アラビア語(アルジェリア) 0x1401 0x0401 アラビア語_CI_AS
アラビア語(バーレーン) 0x3c01 0x0401 アラビア語_CI_AS
アラビア語(エジプト) 0x0c01 0x0401 アラビア語_CI_AS
アラビア語(イラク) 0x0801 0x0401 アラビア語_CI_AS
アラビア語(ヨルダン) 0x2c01 0x0401 アラビア語_CI_AS
アラビア語(クウェート) 0x3401 0x0401 アラビア語_CI_AS
アラビア語(レバノン) 0x3001 0x0401 アラビア語_CI_AS
アラビア語(リビア) 0x1001 0x0401 アラビア語_CI_AS
アラビア語(モロッコ) 0x1801 0x0401 アラビア語_CI_AS
アラビア語(オマーン) 0x2001 0x0401 アラビア語_CI_AS
アラビア語(カタール) 0x4001 0x0401 アラビア語_CI_AS
アラビア語(サウジアラビア) 0x0401 0x0401 アラビア語_CI_AS
アラビア語(シリア) 0x2801 0x0401 アラビア語_CI_AS
アラビア語(チュニジア) 0x1c01 0x0401 アラビア語_CI_AS
アラビア語(アラブ首長国連邦) 0x3801 0x0401 アラビア語_CI_AS
アラビア語(イエメン) 0x2401 0x0401 アラビア語_CI_AS
アルメニア語(アルメニア) 0x042b 0x0419 Latin1_General_CI_AS
アッサム語(インド) 0x044d 0x044d サーバーレベルでは使用できません
アゼルバイジャン語(アゼルバイジャン語、キリル文字) 0x082c 0x082c 非推奨、サーバーレベルでは使用できません
アゼルバイジャン語(アゼルバイジャン語、ラテン語) 0x042c 0x042c 非推奨、サーバーレベルでは使用できません
バシキール語(ロシア語) 0x046d 0x046d Latin1_General_CI_AI
バスク(バスク) 0x042d 0x0409 Latin1_General_CI_AS
ベラルーシ語(ベラルーシ) 0x0423 0x0419 Cyrillic_General_CI_AS
バングラ(バングラデシュ) 0x0845 0x0445 サーバーレベルでは使用できません
ベンガル語(インド) 0x0445 0x0439 サーバーレベルでは使用できません
ボスニア語(ボスニア・ヘルツェゴビナ、キリル文字) 0x201a 0x201a Latin1_General_CI_AI
ボスニア語(ボスニア・ヘルツェゴビナ、ラテン語) 0x141a 0x141a Latin1_General_CI_AI
ブレトン(フランス) 0x047e 0x047e Latin1_General_CI_AI
ブルガリア語(ブルガリア) 0x0402 0x0419 Cyrillic_General_CI_AS
カタロニア語(カタロニア語) 0x0403 0x0409 Latin1_General_CI_AS
中国語(香港特別行政区、中国) 0x0c04 0x0404 Chinese_Taiwan_Stroke_CI_AS
中国語(マカオSAR) 0x1404 0x1404 Latin1_General_CI_AI
中国語(マカオ) 0x21404 0x21404 Latin1_General_CI_AI
中国語(PRC) 0x0804 0x0804 Chinese_PRC_CI_AS
中国語(PRC) 0x20804 0x20804 Chinese_PRC_Stroke_CI_AS
中国語(シンガポール) 0x1004 0x0804 Chinese_PRC_CI_AS
中国語(シンガポール) 0x21004 0x20804 Chinese_PRC_Stroke_CI_AS
中国語(台湾) 0x30404 0x30404 Chinese_Taiwan_Bopomofo_CI_AS
中国語(台湾) 0x0404 0x0404 Chinese_Taiwan_Stroke_CI_AS
コルシカ島(フランス) 0x0483 0x0483 Latin1_General_CI_AI
クロアチア語(ボスニア・ヘルツェゴビナ、ラテン語) 0x101a 0x041a クロアチア語_CI_AS
クロアチア語(クロアチア語) 0x041a 0x041a クロアチア語_CI_AS
チェコ語(チェコ共和国) 0x0405 0x0405 Czech_CI_AS
デンマーク語(デンマーク) 0x0406 0x0406 デンマーク語_ノルウェー語_CI_AS
ダリー語(アフガニスタン) 0x048c 0x048c Latin1_General_CI_AI
ディベヒ語(モルディブ) 0x0465 0x0465 サーバーレベルでは使用できません
オランダ語(ベルギー) 0x0813 0x0409 Latin1_General_CI_AS
オランダ語(オランダ) 0x0413 0x0409 Latin1_General_CI_AS
英語(オーストラリア) 0x0c09 0x0409 Latin1_General_CI_AS
英語(ベリーズ) 0x2809 0x0409 Latin1_General_CI_AS
英語(カナダ) 0x1009 0x0409 Latin1_General_CI_AS
英語(カリブ海) 0x2409 0x0409 Latin1_General_CI_AS
英語(インド) 0x4009 0x0409 Latin1_General_CI_AS
英語(アイルランド) 0x1809 0x0409 Latin1_General_CI_AS
英語(ジャマイカ) 0x2009 0x0409 Latin1_General_CI_AS
英語(マレーシア) 0x4409 0x0409 Latin1_General_CI_AS
英語(ニュージーランド) 0x1409 0x0409 Latin1_General_CI_AS
英語(フィリピン) 0x3409 0x0409 Latin1_General_CI_AS
英語(シンガポール) 0x4809 0x0409 Latin1_General_CI_AS
英語(南アフリカ) 0x1c09 0x0409 Latin1_General_CI_AS
英語(トリニダード・トバゴ) 0x2c09 0x0409 Latin1_General_CI_AS
英語(イギリス) 0x0809 0x0409 Latin1_General_CI_AS
英語(米国) 0x0409 0x0409 SQL_Latin1_General_CP1_CI_AS
英語(ジンバブエ) 0x3009 0x0409 Latin1_General_CI_AS
エストニア語(エストニア) 0x0425 0x0425 エストニア語_CI_AS
フェロー語(フェロー諸島) 0x0438 0x0409 Latin1_General_CI_AS
フィリピン人(フィリピン) 0x0464 0x0409 Latin1_General_CI_AS
フィンランド語(フィンランド) 0x040b 0x040b Finnish_Swedish_CI_AS
フランス語(ベルギー) 0x080c 0x040c French_CI_AS
フランス語(カナダ) 0x0c0c 0x040c French_CI_AS
フランス語(フランス) 0x040c 0x040c French_CI_AS
フランス語(ルクセンブルグ) 0x140c 0x040c French_CI_AS
フランス語(モナコ) 0x180c 0x040c French_CI_AS
フランス語(スイス) 0x100c 0x040c French_CI_AS
フリジア語(オランダ) 0x0462 0x0462 Latin1_General_CI_AI
ガリシア語 0x0456 0x0409 Latin1_General_CI_AS
ジョージア(ジョージア) 0x10437 0x10437 Georgian_Modern_Sort_CI_AS
ジョージア(ジョージア) 0x0437 0x0419 Latin1_General_CI_AS
ドイツ語-電話帳ソート(DIN) 0x10407 0x10407 German_PhoneBook_CI_AS
ドイツ語(オーストリア) 0x0c07 0x0409 Latin1_General_CI_AS
ドイツ語(ドイツ) 0x0407 0x0409 Latin1_General_CI_AS
ドイツ語(リヒテンシュタイン) 0x1407 0x0409 Latin1_General_CI_AS
ドイツ語(ルクセンブルグ) 0x1007 0x0409 Latin1_General_CI_AS
ドイツ語(スイス) 0x0807 0x0409 Latin1_General_CI_AS
ギリシャ語(ギリシャ語) 0x0408 0x0408 Greek_CI_AS
グリーンランド語(グリーンランド) 0x046f 0x0406 デンマーク語_ノルウェー語_CI_AS
グジャラート語(インド) 0x0447 0x0439 サーバーレベルでは使用できません
ハウサ語(ナイジェリア、ラテン語) 0x0468 0x0409 Latin1_General_CI_AS
ヘブライ語(イスラエル) 0x040d 0x040d ヘブライ語_CI_AS
ヒンディー語(インド) 0x0439 0x0439 サーバーレベルでは使用できません
ハンガリー語(ハンガリー) 0x040e 0x040e Hungarian_CI_AS
ハンガリーのテクニカルソート 0x1040e 0x1040e Hungarian_Technical_CI_AS
アイスランド語(アイスランド) 0x040f 0x040f アイスランド語_CI_AS
イボ(ナイジェリア) 0x0470 0x0409 Latin1_General_CI_AS
インドネシア語(インドネシア) 0x0421 0x0409 Latin1_General_CI_AS
イヌクティトゥット語(カナダ、ラテン語) 0x085d 0x0409 Latin1_General_CI_AS
イヌクティトゥット語(音節)カナダ 0x045d 0x045d Latin1_General_CI_AI
アイルランド語(アイルランド) 0x083c 0x0409 Latin1_General_CI_AS
イタリア語(イタリア) 0x0410 0x0409 Latin1_General_CI_AS
イタリア語(スイス) 0x0810 0x0409 Latin1_General_CI_AS
日本語(日本XJIS) 0x0411 0x0411 Japanese_CI_AS
日本語(日本) 0x040411 0x40411 Latin1_General_CI_AI
カンナダ語(インド) 0x044b 0x0439 サーバーレベルでは使用できません
カザフ語(カザフスタン) 0x043f 0x043f カザフ_90_CI_AS
クメール語(カンボジア) 0x0453 0x0453 サーバーレベルでは使用できません
キチェ語(グアテマラ) 0x0486 0x0c0a Modern_Spanish_CI_AS
ルワンダ語(ルワンダ) 0x0487 0x0409 Latin1_General_CI_AS
コンカニ語(インド) 0x0457 0x0439 サーバーレベルでは使用できません
韓国語(韓国語辞書ソート) 0x0412 0x0412 Korean_Wansung_CI_AS
キルギス(キルギスタン) 0x0440 0x0419 Cyrillic_General_CI_AS
ラオス(ラオス) 0x0454 0x0454 サーバーレベルでは使用できません
ラトビア語(ラトビア) 0x0426 0x0426 ラトビア語_CI_AS
リトアニア語(リトアニア) 0x0427 0x0427 リトアニア語_CI_AS
低ソルブ語(ドイツ) 0x082e 0x0409 Latin1_General_CI_AS
ルクセンブルク語(ルクセンブルグ) 0x046e 0x0409 Latin1_General_CI_AS
マケドニア語(北マケドニア、FYROM) 0x042f 0x042f マケドニア語_FYROM_90_CI_AS
マレー語(ブルネイダルサラーム) 0x083e 0x0409 Latin1_General_CI_AS
マレー語(マレーシア) 0x043e 0x0409 Latin1_General_CI_AS
マラヤーラム語(インド) 0x044c 0x0439 サーバーレベルでは使用できません
マルタ(マルタ) 0x043a 0x043a Latin1_General_CI_AI
マオリ(ニュージーランド) 0x0481 0x0481 Latin1_General_CI_AI
マプチェ語(チリ) 0x047a 0x047a Latin1_General_CI_AI
マラーティー語(インド) 0x044e 0x0439 サーバーレベルでは使用できません
モーホーク(カナダ) 0x047c 0x047c Latin1_General_CI_AI
モンゴル語(モンゴル語) 0x0450 0x0419 Cyrillic_General_CI_AS
モンゴル(PRC) 0x0850 0x0419 Cyrillic_General_CI_AS
ネパール(ネパール) 0x0461 0x0461 サーバーレベルでは使用できません
ノルウェー語(ブークモール、ノルウェー) 0x0414 0x0414 Latin1_General_CI_AI
ノルウェー語(ノルウェー、ニーノシュク) 0x0814 0x0414 Latin1_General_CI_AI
オック語(フランス) 0x0482 0x040c French_CI_AS
オディア語(インド) 0x0448 0x0439 サーバーレベルでは使用できません
パシュトゥー語(アフガニスタン) 0x0463 0x0463 サーバーレベルでは使用できません
ペルシア語(イラン) 0x0429 0x0429 Latin1_General_CI_AI
ポーランド語(ポーランド) 0x0415 0x0415 ポーランド語_CI_AS
ポルトガル語(ブラジル) 0x0416 0x0409 Latin1_General_CI_AS
ポルトガル語(ポルトガル語) 0x0816 0x0409 Latin1_General_CI_AS
パンジャブ(インド) 0x0446 0x0439 サーバーレベルでは使用できません
ケチュア語(ボリビア) 0x046b 0x0409 Latin1_General_CI_AS
ケチュア語(エクアドル) 0x086b 0x0409 Latin1_General_CI_AS
ケチュア語(ペルー) 0x0c6b 0x0409 Latin1_General_CI_AS
ルーマニア語(ルーマニア) 0x0418 0x0418 ルーマニア語_CI_AS
ロマンシュ語(スイス) 0x0417 0x0417 Latin1_General_CI_AI
ロシア語(ロシア) 0x0419 0x0419 Cyrillic_General_CI_AS
サハ(ロシア) 0x0485 0x0485 Latin1_General_CI_AI
サミ(フィンランド、イナリ) 0x243b 0x083b Latin1_General_CI_AI
サミ語(ルレ、ノルウェー) 0x103b 0x043b Latin1_General_CI_AI
サミ語(ルレ、スウェーデン) 0x143b 0x083b Latin1_General_CI_AI
サミ語(フィンランド北部) 0x0c3b 0x083b Latin1_General_CI_AI
サミ語(ノルウェー北部) 0x043b 0x043b Latin1_General_CI_AI
サミ語(スウェーデン北部) 0x083b 0x083b Latin1_General_CI_AI
サミ(フィンランド、スコルト) 0x203b 0x083b Latin1_General_CI_AI
サミ(ノルウェー南部) 0x183b 0x043b Latin1_General_CI_AI
南部サーミ語(スウェーデン南部) 0x1c3b 0x083b Latin1_General_CI_AI
サンスクリット語(インド) 0x044f 0x0439 サーバーレベルでは使用できません
セルビア語(ボスニア・ヘルツェゴビナ、キリル文字) 0x1c1a 0x0c1a Latin1_General_CI_AI
セルビア語(ボスニア・ヘルツェゴビナ、ラテン語) 0x181a 0x081a Latin1_General_CI_AI
セルビア語(セルビア語、キリル文字) 0x0c1a 0x0c1a Latin1_General_CI_AI
セルビア語(セルビア、ラテン語) 0x081a 0x081a Latin1_General_CI_AI
セソトサレボア/北ソト(南アフリカ) 0x046c 0x0409 Latin1_General_CI_AS
セツワナ語/ツワナ語(南アフリカ) 0x0432 0x0409 Latin1_General_CI_AS
シンハラ語(スリランカ) 0x045b 0x0439 サーバーレベルでは使用できません
スロバキア(スロバキア) 0x041b 0x041b スロバキア語_CI_AS
スロベニア語(スロベニア) 0x0424 0x0424 スロベニア語_CI_AS
スペイン語(アルゼンチン) 0x2c0a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ボリビア) 0x400a 0x0c0a Modern_Spanish_CI_AS
スペイン語(チリ) 0x340a 0x0c0a Modern_Spanish_CI_AS
スペイン語(コロンビア) 0x240a 0x0c0a Modern_Spanish_CI_AS
スペイン語(コスタリカ) 0x140a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ドミニカ共和国) 0x1c0a 0x0c0a Modern_Spanish_CI_AS
スペイン語(エクアドル) 0x300a 0x0c0a Modern_Spanish_CI_AS
スペイン語(エルサルバドル) 0x440a 0x0c0a Modern_Spanish_CI_AS
スペイン語(グアテマラ) 0x100a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ホンジュラス) 0x480a 0x0c0a Modern_Spanish_CI_AS
スペイン語(メキシコ) 0x080a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ニカラグア) 0x4c0a 0x0c0a Modern_Spanish_CI_AS
スペイン語(パナマ) 0x180a 0x0c0a Modern_Spanish_CI_AS
スペイン語(パラグアイ) 0x3c0a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ペルー) 0x280a 0x0c0a Modern_Spanish_CI_AS
スペイン語(プエルトリコ) 0x500a 0x0c0a Modern_Spanish_CI_AS
スペイン語(スペイン) 0x0c0a 0x0c0a Modern_Spanish_CI_AS
スペイン語(スペイン語、伝統的な並べ替え) 0x040a 0x040a Traditional_Spanish_CI_AS
スペイン語(米国) 0x540a 0x0409 Latin1_General_CI_AS
スペイン語(ウルグアイ) 0x380a 0x0c0a Modern_Spanish_CI_AS
スペイン語(ベネズエラ) 0x200a 0x0c0a Modern_Spanish_CI_AS
スワヒリ語(ケニア) 0x0441 0x0409 Latin1_General_CI_AS
スウェーデン語(フィンランド) 0x081d 0x040b Finnish_Swedish_CI_AS
スウェーデン語(スウェーデン語) 0x041d 0x040b Finnish_Swedish_CI_AS
シリア語(シリア) 0x045a 0x045a サーバーレベルでは使用できません
タジク語(タジキスタン) 0x0428 0x0419 Cyrillic_General_CI_AS
Tamazight(アルジェリア、ラテン語) 0x085f 0x085f Latin1_General_CI_AI
タミル語(インド) 0x0449 0x0439 サーバーレベルでは使用できません
タタール語(ロシア語) 0x0444 0x0444 Cyrillic_General_CI_AS
テルグ語(インド) 0x044a 0x0439 サーバーレベルでは使用できません
タイ語(タイ) 0x041e 0x041e Thai_CI_AS
チベット(PRC) 0x0451 0x0451 サーバーレベルでは使用できません
トルコ語(トルコ語) 0x041f 0x041f トルコ語_CI_AS
トルクメン語(トルクメニスタン) 0x0442 0x0442 Latin1_General_CI_AI
ウイグル(PRC) 0x0480 0x0480 Latin1_General_CI_AI
ウクライナ語(ウクライナ語) 0x0422 0x0422 ウクライナ語_CI_AS
高ソルブ語(ドイツ) 0x042e 0x042e Latin1_General_CI_AI
ウルドゥー語(パキスタン) 0x0420 0x0420 Latin1_General_CI_AI
ウズベク語(ウズベキスタン、キリル文字) 0x0843 0x0419 Cyrillic_General_CI_AS
ウズベク語(ウズベキスタン、ラテン語) 0x0443 0x0443 Uzbek_Latin_90_CI_AS
ベトナム語(ベトナム) 0x042a 0x042a ベトナム語_CI_AS
ウェールズ語(イギリス) 0x0452 0x0452 Latin1_General_CI_AI
ウォロフ語(セネガル) 0x0488 0x040c French_CI_AS
コサ語/ isiXhosa(南アフリカ) 0x0434 0x0409 Latin1_General_CI_AS
イー(PRC) 0x0478 0x0409 Latin1_General_CI_AS
ヨルバ(ナイジェリア) 0x046a 0x0409 Latin1_General_CI_AS
ズールー語/ isiZulu(南アフリカ) 0x0435 0x0409 Latin1_General_CI_AS

サーバーに照合を割り当てた後は、すべてのデータベースオブジェクトとデータをエクスポートし、再構築することによってのみ変更できます。 主人 データベース、およびすべてのデータベースオブジェクトとデータのインポート。 Instead of changing the default collation of an instance of SQL Server, you can specify the desired collation when you create a new database or database column.

To query the server collation for an instance of SQL Server, use the SERVERPROPERTY function:

To query the server for all available collations, use the following fn_helpcollations() built-in function:

Database-level collations

When you create or modify a database, you can use the COLLATE clause of the CREATE DATABASE or ALTER DATABASE statement to specify the default database collation. If no collation is specified, the database is assigned the server collation.

You can't change the collation of system databases unless you change the collation for the server.

The database collation is used for all metadata in the database, and the collation is the default for all string columns, temporary objects, variable names, and any other strings used in the database. When you change the collation of a user database, there can be collation conflicts when queries in the database access temporary tables. Temporary tables are always stored in the tempdb system database, which uses the collation for the instance. Queries that compare character data between the user database and tempdb might fail if the collations cause a conflict in evaluating the character data. You can resolve this issue by specifying the COLLATE clause in the query. For more information, see COLLATE (Transact-SQL).

You can't change the collation after the database has been created on Azure SQL Database.

You can change the collation of a user database by using an ALTER DATABASE statement that's similar to the following:


The fundamental idea of NVARCHAR

NCHAR, NVARCHAR or NTEXT are similar to CHAR, VARCHAR OR TEXT, where the N prefix represents the International Language Character Set. The N-prefixed data types indicate that the resulting string could be comprised of a Unicode character set with variable length where each character occupies 2 bytes. Without the N prefix, the string could be converted to the default charset of the database but could result in certain special characters not being recognized as part of the International Language Character Set.

Today’s development platforms or their operating systems support the Unicode character set. Therefore, In SQL Server, you should utilize NVARCHAR rather than VARCHAR. If you do use VARCHAR when Unicode support is present, then an encoding inconsistency will arise while communicating with the database. This inconsistency causes query performance issues that eventually generate errors like blocking or a deadlock in SQL Server.

How can you recover from this query performance issue? Indexes can fail when an incorrect data type has been used within a column. In SQL Server, if an indexed VARCHAR column is presented with a Unicode N string, SQL Server won’t be able to make use of the index. A similar query performance issue occurs when an indexed column containing INTEGER data is presented with VARCHAR type data. We will talk about more examples below.

Imagine, that a SalesOrderHeader table has an AccountNumber column with VARCHAR data type and the total number of rows is 31,465. What will occur if we use prefix N before a string in a WHERE condition? Here, we will investigate a couple of query performance parameters on query execution, for example, logical reads, index utilization, execution time, etc.


Binary Collation for UTF-8

CTP 2.0 did not come with a binary UTF-8 collation. Why might we need / want one? Well, here are some reasons:

  1. Microsoft&rsquos implementation of Unicode has incomplete, and some incorrect, sort weights.一例:
    Choosing a binary collation that can differentiate between ‘ss’ and ‘ß’ for nvarchar column in Sql Server
  2. When needing to know if two values are 100% identical, you need a binary Collation (such as when auditing for changes, etc). Even if all characters had correct sort weights, you still wouldn&rsquot be able to differentiate between a base character plus a combining diacritic and the pre-composed single character equivalent. Nor would you be able to differentiate between a base character plus multiple combining diacritics and the same characters with a different order for the diacritics. In both of those cases, the visual representation of the &ldquocharacter&rdquo is the same, but the number or order of the underlying Code Points would be different. The first item from the following post provides a working example: No, Binary Collations are not Case-Sensitive
  3. When storing alphanumeric codes (e.g. airline confirmation codes, phone numbers, postal codes, etc), binary sorting and comparison is 多くの faster since it ignores all linguistic rules, which is perfect for scenarios such as these where there is no expectation of applying such rules.
  4. Finding / removing "(null)" character U+0000 / CHAR(0)

CTP 2.3 introduced the long-awaited BIN2 collation: UTF8_BIN2 . This was a definite improvement over not having one, but there were a few issues that absolutely needed to be addressed.

  1. It exists (Yay!)
  2. No BIN collation to confuse people with.
  3. Only one BIN2 collation no BIN2 per each culture, which would have added no benefit and likely would have confused people wondering what the difference was between the various UTF8_BIN2 collations.

Not So Good

  1. Version 80 used instead of 140. This is a problem because version 80 is missing 649 uppercase / lowercase mappings that version 140 collations have. This affects the accuracy of the UPPER and LOWER functions.
  2. No version number in the name, so inconsistent with all other Windows collations.
  3. No culture name, so inconsistent with all other collations. Should be something like "Invariant" or "General", or even "Latin1_General_version#_" if need be (since the UTF8_BIN2 collation does have an LCID of 1033, which is "Latin1_General").

This is a MAJOR problem, actually. On the surface it appears to be nothing more than a different way to name the collation. But, there is an issue that is hidden by the fact that the version 80 collations don&rsquot include the version number (i.e. "80") in the collation name. The last major update of collations was the version 100 collations that introduced many new collations as well as used a newer version of Unicode. Newer versions of Unicode have more sort weights defined, more upper-case / lower-case mappings defined, and some fixes to previous weights and/or mappings that might not have been correct. The version 100 collations were introduced in SQL Server 2008. SQL Server 2017 did introduce some version 140 collations with an even newer version of Unicode, しかし that was for それだけ the Japanese collations. At some point, Microsoft is going to need to bring the rest of the version 100 collations up to the 140 level (or beyond). When that happens, all of the new collations will have the new version number in their names. That&rsquos fine for all collations それ外 UTF8_BIN2 . SQL Server 2019, which is version 150, didn&rsquot introduce new collations with newer Unicode sort weights (the UTF-8 collations are just the existing collations that do a different 8-bit encoding). So, assuming the next version of SQL Server does upgrade the Unicode info, that would be version 160. Since there is already a UTF8_BIN2 collation that isn&rsquot going to have its definition changed, a new collation will be added, and the naming convention would make it: 160_UTF8_BIN2 . That might look ok, but identifiers (i.e. names of things in the system), cannot begin with a number. This will be quite the difficult situation once somebody attempts to create this new collation.

Final Resolution

CTP 3.0 finally resolved 99% of the issues related to UTF-8 binary collations. The binary collation was updated to be: Latin1_General_100_BIN2_UTF8 .

  1. Version is 100 instead of 80, so many more upper-case / lower-case mappings (even if not as many as version 140)
  2. Name is now prefixed with a culture name, which is not only consistent with all other collations, but also avoids the problem is ending up with a version of the UTF-8 binary collation that begins with a number (again, that would not be a valid identifier).

Only remaining issue is that a second binary collation is needed for the Turkish locale / culture as the upper-case / lower-case mappings for i and I are not the same as in all other cultures. I submitted a feedback suggestion for this:

Finally, there&rsquos a rather minor issue in that the new Latin1_General_100_BIN2_UTF8 collation does not work with the NTEXT datatype. This is a problem because the new UTF-8 collations are not supposed to affect NVARCHAR / UTF-16 data, binary collations do not fully support / recognize Supplementary Characters, yet that&rsquos the error message one gets when attempting to use Latin1_General_100_BIN2_UTF8 with NTEXT . Of course, the NTEXT datatype has been deprecated since the release of SQL Server 2005, so this is likely a rather low priority. Still, I filled a bug report for it here:


It looks like your varbinary string got injected with some nonsense. All of the sequences of two 00 values are null characters, so this is why your string is terminating upon conversion. The first character is 0x24 (dollar sign), which is why the output is just a dollar sign.

Now, if I take your string and strip out all of the 00 sequences:

I get something close again, there is a bunch of garbage in there, but the string you're after in there:

You can ignore the leading garbage by just taking the original value and performing RIGHT() against it, but this assumes that the important part of the string is always the same length (we can't tell you if that's true).

Or using SUBSTRING , but this assumes that the garbage at the beginning of the string is always the same length:

We also can't possibly tell you どうして that garbage is there and if it has any additional meaning. You'll need to find out how the values got encoded this way in the first place. The value you wanted encoded, 22639935-KCN , should have looked a little differently as varbinary :

So, again, you will need to do some research to find out why this value wasn't encoded this way. We can't answer all of this because we didn't design your system or store those values.


ASCII encoding error when updating field content in SQL Server table - Geographic Information Systems

The following note and error message indicate that a SAS ® data set has an encoding value that does not match the encoding setting for the SAS session:

In order to confirm the mismatch, use the following code for further debugging where libref.datasetname is the name of the problematic data set:

Compare the encoding value setting of the SAS session with the encoding value setting of the data set. If the two do not match, then the SAS session should be invoked with the encoding value shown for the data set. The CONFIG information from the OPTIONS procedure displays in the SAS log the config file currently in use, usually !SASHomeSASFoundation9.NS ls 。 The same directory contains other configuration files, at a minimum: en (English), 1d (DBCS), and u8 (Unicode). Locate the desired configuration file, and use this file to invoke SAS.

In the following use case, the data set shows UTF8 encoding, and the SAS ® 9.4 session shows Wlatin1 encoding:

Your SAS session should be invoked with UTF-8 encoding in order to avoid the NOTE and ERROR.

To invoke SAS using UTF-8 encoding on Windows, do one of the following:

  • から 始める menu, select All ProgramsSASAdditional LanguagesSAS 9.NS (Unicode Support).
  • From a desktop icon, do the following:
    1. Right-click the SAS icon and select プロパティ。に Shortcut tab, in the Target line, add the desired configuration file (with the complete path) to the end:

On UNIX platforms, the SAS invocation scripts are located in:

More information specific to UNIX platforms can be found under Post-installation Configuration for National Language Support.

If a conversion of the encoding value for the SAS data set is necessary, confer with Usage Note 15597: How to convert SAS ® data set encoding.

The following link contains additional NLS documentation: SAS ® National Language Support (NLS).

Starting in SAS ® 9.4M5 (TS1M5), you can use the %VALIDCHS macro function to validate the character encoding compatibility for data set variables.