3

[password]として保存された列を持つテーブルがありますnvarchar(max)。に変換したいvarbinary(max)

という新しい列を作成し、[temp]それを として宣言しましたvarbinary(max)。次に、次を使用して更新しましたCONVERT

update tempuser set [temp]=CONVERT(varbinary(max), CONVERT(nvarchar(max),[password]))

[temp] 列の値が異なります。たとえば、[password]これで開始するための 1 つの値:

0x3E6AFF88...

[temp] の対応するエントリは次で始まります。

0x30783345...

またある場合[password]NULL[temp]となり0x4E554C4Cます。

4

3 に答える 3

11

で始まるため、たまたまバイナリ値のように見える文字列を変換しています0x。残念ながら、これらは同じものではありません。文字列を実際のバイナリ値として解釈して直接変換することを SQL Server が理解するには、文字列をバイナリ表現に変換するのではなく、スタイル パラメータを使用する必要があります。 :

UPDATE dbo.tempuser -- please always use the schema prefix
  SET [temp] = CONVERT(VARBINARY(MAX), [password], 1); -- and semi-colons

NVARCHAR(MAX)を to に変換するNVARCHAR(MAX)必要がないことに注意してください。

NVARCHAR(MAX)ここで、何らかの理由で選択したため、変換できないガベージが列に含まれている可能性があるため、次のエラーが発生する可能性があります。

メッセージ 8114、レベル 16、状態 5
データ型 nvarchar を varbinary に変換中にエラーが発生しました。

その場合、先頭にない0x(または不適切な文字を含む) 値を見つけて修正する必要があります。

于 2013-07-09T18:26:42.173 に答える
1

パスワード フィールドは実際には varbinary のように見えますが、そうではないようです。

例としてこれらを実行します。

SELECT CAST('0x3E6AFF88BEB29D9B234B9E5A5AD329D8D3F33200EC4EE02749C56AD58D040976' AS varbinary(max))
SELECT CAST(CAST('0x3E6AFF88BEB29D9B234B9E5A5AD329D8D3F33200EC4EE02749C56AD58D040976' AS varbinary(max))AS VARCHAR(MAX))

SELECT CAST('dog' AS VARBINARY(MAX))
SELECT CAST(CAST('dog' AS VARBINARY(max))AS VARCHAR(MAX))

結果は最初の文字列と同等で、varbinary 形式のみであることがわかります。

于 2013-07-09T18:08:40.840 に答える