Храните такие символы в SQL Server 2008 R2 - PullRequest
0 голосов
/ 26 июня 2011

Я храню зашифрованные пароли в базе данных, до сих пор она отлично работала на MachineA. Теперь, когда я перешел на MachineB, результаты в таблице искажены.

Например: ù9qÆæ\2 Ý-³Å¼]ó изменится на ?9q??\2 ?-³?¼]? в таблице.

Вот запрос, который я использую:

ALTER PROC [Employees].[pRegister](@UserName NVARCHAR(50),@Password VARCHAR(150))

AS
BEGIN

DECLARE @Id UNIQUEIDENTIFIER
SET @Id = NEWID()

SET @password = HashBytes('MD5', @password + CONVERT(VARCHAR(50),@Id))

SELECT @Password

INSERT INTO Employees.Registry (Id,[Name],[Password]) VALUES (@Id, @UserName,@Password) 

END
  • Сортировка: SQL_Latin1_General_CP1_CI_AS
  • ProductVersion: 10.50.1600.1

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

Вы смешиваете 2 типа данных:

  • пароль должен быть nvarchar для поддержки незападных европейских символов
  • литералам нужен префикс N

Демо-версия:

DECLARE @pwdgood nvarchar(150), @pwdbad varchar(150)
SET @pwdgood = N'ù9qÆæ\2 Ý-³Å¼]ó'
SET @pwdbad = N'?9q??\2 ?-³?¼]?'
SELECT @pwdgood, @pwdbad
  • HashBytes дает varbinary (8000), поэтому вам нужно это в таблице

Примечание: я бы также рассмотрел добавление хранимого пароля к чему-то другому , чем столбец идентификатора для этой строки

0 голосов
/ 26 июня 2011

Если вы хотите хранить такие символы, вам необходимо:

  • используйте NVARCHAR в качестве типа данных для ваших столбцов и параметров (@Password не NVARCHAR, а CAST, который вы используете для назначения пароля в таблице базы данных, isn ' * используя NVARCHAR в вашем примере ...)
  • использовать синтаксис N'....' для указания строковых литералов Unicode

Имея эти два, вы должны быть абсолютно в состоянии хранить и извлекать любой действительный символ Unicode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...