一部の挿入T-SQLクエリでプレフィックスNを確認しました。多くの人はN
、テーブルに値を挿入する前に使用しました。
N
検索しましたが、テーブルに文字列を挿入する前に、何を含めるのか理解できませんでした。
INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),
この「N」プレフィックスはどのような目的で使用され、いつ使用する必要がありますか?
一部の挿入T-SQLクエリでプレフィックスNを確認しました。多くの人はN
、テーブルに値を挿入する前に使用しました。
N
検索しましたが、テーブルに文字列を挿入する前に、何を含めるのか理解できませんでした。
INSERT INTO Personnel.Employees
VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),
この「N」プレフィックスはどのような目的で使用され、いつ使用する必要がありますか?
nvarchar
文字列をデータ型としてではなく、データ型として宣言していますvarchar
Nプレフィックスを使用して文字列を渡すTransact-SQLコードを見たことがあるかもしれません。これは、後続の文字列がUnicodeであることを示します(Nは実際には国語の文字セットを表します)。これは、CHAR、VARCHAR、またはTEXTではなく、NCHAR、NVARCHAR、またはNTEXT値を渡すことを意味します。
Microsoftから引用するには:
Unicode文字列定数の前に文字Nを付けます。Nの接頭辞がないと、文字列はデータベースのデフォルトのコードページに変換されます。このデフォルトのコードページは、特定の文字を認識しない場合があります。
これら2つのデータ型の違いを知りたい場合は、次のSO投稿を参照してください。
プレフィックスで起こった厄介なことをお話ししましょうN'
-私は2日間それを修正することができませんでした。
私のデータベース照合はSQL_Latin1_General_CP1_CI_ASです。
MyCol1という列を持つテーブルがあります。Nvarcharです
このクエリは、存在する正確な値と一致しません。
SELECT TOP 1 * FROM myTable1 WHERE MyCol1 = 'ESKİ'
// 0 result
プレフィックスN''を使用すると修正されます
SELECT TOP 1 * FROM myTable1 WHERE MyCol1 = N'ESKİ'
// 1 result - found!!!!
なんで?latin1_generalには大きな点線がないので、失敗するのではないかと思います。
1.パフォーマンス:
where句が次のようになっていると仮定します。
WHERE NAME='JON'
NAME列がnvarcharまたはnchar以外のタイプである場合は、Nプレフィックスを指定しないでください。ただし、NAME列のタイプがnvarcharまたはncharの場合、Nプレフィックスを指定しないと、「JON」は非ユニコードとして扱われます。これは、NAME列と文字列'JON'のデータ型が異なるため、SQLServerが暗黙的に一方のオペランドの型をもう一方のオペランドに変換することを意味します。SQL Serverがリテラルの型を列の型に変換する場合、問題はありませんが、その逆の場合、列のインデックス(使用可能な場合)が使用されないため、パフォーマンスが低下します。
2.文字セット:
列のタイプがnvarcharまたはncharの場合、WHERE基準/ UPDATE / INSERT句で文字列を指定するときは、常にプレフィックスNを使用してください。これを行わず、文字列内の文字の1つがユニコード(国際文字-例-āなど)の場合、失敗するか、データが破損します。
値がnvarcharタイプであると仮定すると、N''を使用しているだけです。