54

and と同様CHAR (CHARACTER)VARCHAR (CHARACTER VARYING)、SQL はNCHAR (NATIONAL CHARACTER)andNVARCHAR (NATIONAL CHARACTER VARYING)型を提供します。一部のデータベースでは、これは文字 (非バイナリ) 文字列に使用するのに適したデータ型です。

  • SQL Server では、NCHARUTF-16LE として格納され、非 ASCII 文字を確実に格納する唯一の方法でありCHAR、シングルバイト コードページのみです。

  • Oracle ではNVARCHAR、シングルバイトの照合順序ではなく、UTF-16 または UTF-8 として格納できます。

  • しかし、MySQL ではNVARCHARisVARCHARであるため、どちらのタイプも UTF-8 またはその他の照合で保存できます。

では、NATIONAL概念的には実際には何を意味するのでしょうか。ベンダーのドキュメントは、実際の理論的根拠ではなく、ベンダー自身の DBMS が使用する文字セットについてのみ説明しています。NATIONAL CHARACTER一方、SQL92 標準では、実装定義の文字セットに格納されていることだけを述べて、この機能についてあまり役に立たない説明をしています。単なるCHARACTERとは対照的に、実装定義の文字セットに格納されます。これは、異なる実装定義の文字セットである可能性があります。か否か。

ありがとう、ANSI。タンシ。

NVARCHARすべての文字 (非バイナリ) ストレージの目的で使用する必要がありますか? 現在人気のある DBMS で望ましくないことを行ったり、キーワード (またはN''リテラル) を認識しないものはありますか?

4

3 に答える 3

15

この場合の「NATIONAL」は、さまざまな国籍に固有の文字を意味します。極東言語は特に文字数が非常に多いため、1バイトではすべてを区別するのに十分なスペースがありません。したがって、英語(ASCII)のみのアプリまたは英語のみのフィールドがある場合は、文字ごとに1バイトしか許可されない古いCHAR型とVARCHAR型を使用して回避できます。

そうは言っても、ほとんどの場合、NCHAR/NVARCHARを使用する必要があります。データ内の複数の言語をサポートする(またはサポートする可能性がある)必要がないと思われる場合でも、英語のみのアプリでさえ、外国語の文字を使用したセキュリティ攻撃を適切に処理できる必要があります。

私の意見では、古いCHAR / VARCHARタイプが依然として好まれる唯一の場所は、頻繁に参照されるASCIIのみの内部コードと、区別をサポートするSqlServerなどのプラットフォーム上のデータですenum。 C ++やC#などのクライアント言語。

于 2010-10-09T02:11:45.193 に答える
5

一方、SQL92 標準では、NATIONAL CHARACTER が実装定義の文字セットに格納されていることだけを述べており、この機能の説明はあまり役に立ちません。実装定義の文字セットに格納される単なる CHARACTER とは対照的です。これは、異なる実装定義の文字セットである可能性があります。か否か。

char偶然にも、これは C++ 標準が と の間で行うのと同じ「区別」wchar_tです。すべての言語/OS の組み合わせが独自の文字セットを持っているときの文字エンコーディングの暗黒時代の遺物。

すべての文字 (非バイナリ) ストレージの目的で NVARCHAR を使用する必要がありますか?

列の宣言された型がVARCHARまたはであるかどうかは重要ではありませんNVARCHARただし、すべての文字ストレージの目的でUnicode (UTF-8、UTF-16、または UTF-32 のいずれか)を使用することが重要です。

望ましくないことを行う現在人気のある DBMS はありますか?

はい: MS SQL Server で を使用NCHARすると、(英語の) データが 2 倍のスペースを占有します。 残念ながら、UTF-8 はまだサポートされていません。

編集: SQL Server 2019 は、ついにUTF-8 サポートを導入しました。

于 2010-12-10T04:02:04.123 に答える
3

Oracleでは、データベースの文字セットをマルチバイト文字セットにすることができるため、そこにあらゆる種類の文字を格納できます....しかし、列の長さを適切に理解して定義する必要があります(BYTESまたはCHARACTERSのいずれか)。 .

NVARCHAR を使用すると、シングルバイトのデータベース文字セットを使用して (BYTE または CHARACTER サイズの列を混同する可能性が減ります)、マルチバイトとして NVARCHAR を使用することができます。ここを参照してください。

私は主に英語のデータを扱っているので、データベースの文字セットとしてマルチバイト文字セット (主に UTF-8) を使用し、NVARCHAR は無視します。シングルバイト文字セットで大きすぎて変換できない古いデータベースを継承した場合、NVARCHAR を使用することがあります。しかし、私はそうしないほうがいいです。

于 2010-10-09T20:52:35.610 に答える