5

テーブルをデータ型で説明する場合、とnvarcharの違いは何ですか? 私はそれが常に二重であることがわかります。たとえば、値は、精度は 64、長さは 128 です。PrecisionLengthLengthnvarchar(64)

CREATE TABLE T(X nvarchar(64))
EXEC sp_columns 'T'
4

5 に答える 5

6

精度は、テキスト データには意味がありません。

SizeLength プロパティについては、列のサイズ (バイト単位) である SQL Server Management Studio によって報告されるものと混同していると思います。列のは 64 ですがLength、128 です。nvarchar(64)Size

Unicode は各文字に 2 バイトを使用するため、Unicode 型 (nchar、nvarchar) のサイズは文字数の 2 倍になります。

これらの値を取得するには、LEN関数を使用して文字数を取得し、DATALENGTH関数を使用してバイト数を取得します。

select len(N'some value'), datalength(N'some value')

返す10 20

編集

あなたのコメントから、sp_columnsを使用してテーブルのスキーマ情報を取得していることがわかります。カタログ ストアド プロシージャは使用せず、代わりにカタログ ビューを使用してください。

ドキュメントに記載されているように、カタログ ストアド プロシージャは ODBC アプリケーションをサポートするために使用されるため、その結果は限られており、解釈が必要になる場合があります。sp_columnsたとえば、文字とデータの長さを区別しません。

INFORMATION_SCHEMAsysスキーマのようなスキーマ ビューは、詳細で明確な情報を返します。たとえば、INFORMATION_SCHEMA.COLUMNSCHARACTER_MAXIMUM_LENGTHは文字の長さを に、バイト サイズを に返しますCHARACTER_OCTET_LENGTH。また、 によって返されない照合および文字セット情報も含まれますsp_columns

ビューはINFORMATION_SCHEMAISO によって定義されているため、列が計算列であるか、ファイルストリームに格納されているか、レプリケートされているかなど、SQL Server 固有の情報は含まれていません。この情報は、sys.columnsなどのシステム オブジェクト カタログ ビューを使用して取得できます。

于 2013-08-20T14:25:16.410 に答える
1

NVARCHAR には精度がありません。10 進数には精度が使用されます。length は文字の長さです。

nvarchar [ ( n | 最大 ) ]

可変長の Unicode 文字列データ。n は文字列の長さを定義し、1 ~ 4,000 の値を指定できます。max は、最大ストレージ サイズが 2^31-1 バイト (2 GB) であることを示します。ストレージ サイズ (バイト単位) は、入力されたデータの実際の長さの 2 倍 + 2 バイトです。nvarchar の ISO シノニムは、国別文字可変および国別文字可変です。

ソースから:-

精度は、数値の桁数です。

数値データ型の長さは、数値を格納するために使用されるバイト数です。文字列または Unicode データ型の長さは文字数です

于 2013-08-20T14:25:55.260 に答える
0

確かに、これは SQL サーバーの紛らわしいトピックであり、ドキュメンテーションにも一貫性がありません。

たとえば、CREATE TABLEの構文定義を参照してください。

<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max |   
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]  

ここには「長さ | 精度」は表示されませんが、精度のみが表示されます。また、他の人が指摘したように、ドキュメントの他の場所では、文字データ型について話すとき、長さと同じ属性を参照しています。sp_helpやコンパニオンのドキュメントなど、そうでない場合を除きます。

Length  int     Column length in bytes.
Prec    char(5) Column precision.
Scale   char(5) Column scale.

ここで length はストレージの長さです。(ほとんどの人はそれをサイズと呼ぶでしょう。)

残念ながら、あなたの質問に対する正しいまたは最終的な答えはありません。疑問がある場合は、常にコンテキストを考慮し、ドキュメントを参照する必要があります。

于 2016-09-14T17:25:45.287 に答える
0

NVARCHARがなくprecisionlengthが文字長になります。次のSQLを試してください

SELECT LEN('Whats the length of this string?')

Numericこれをまたはと混同している可能性があります。こちらの表Decimalを参照してください

于 2013-08-20T14:26:02.527 に答える