pasar - ¿Cómo hacer una búsqueda sensible a mayúsculas y minúsculas en la cláusula WHERE(estoy usando SQL Server)?
sql like con acentos (7)
Quiero hacer una búsqueda sensible a mayúsculas / minúsculas en mi consulta SQL. Pero de forma predeterminada, SQL Server no tiene en cuenta el caso de las cadenas.
¿Alguna idea sobre cómo hacer una búsqueda sensible a mayúsculas y minúsculas en consultas SQL?
Al usar colación o conversión a binario, así:
SELECT *
FROM Users
WHERE
Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS
AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS
AND Username = @Username
AND Password = @Password
La duplicación de nombre de usuario / contraseña existe para darle al motor la posibilidad de usar índices. La intercalación anterior es una intercalación de mayúsculas y minúsculas, cámbiela a la que necesita si es necesario.
El segundo, lanzar al binario, podría hacerse así:
SELECT *
FROM Users
WHERE
CAST(Username as varbinary(100)) = CAST(@Username as varbinary))
AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100))
AND Username = @Username
AND Password = @Password
En MySQL, si no desea cambiar la intercalación y desea realizar una búsqueda sensible a mayúsculas y minúsculas, simplemente use una palabra clave binaria como esta:
SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter
Puedes hacer la consulta usando convert to varbinary, es muy fácil. Ejemplo:
Select * from your_table where convert(varbinary, your_column) = convert(varbinary, ''aBcD'')
Se puede hacer cambiando el Collation . Por defecto es insensible a mayúsculas / minúsculas.
Extracto del enlace:
SELECT 1
FROM dbo.Customers
WHERE CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS
AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS
usa HASHBYTES
declare @first_value nvarchar(1) = ''a''
declare @second_value navarchar(1) = ''A''
if HASHBYTES(''SHA1'',@first_value) = HASHBYTES(''SHA1'',@second_value) begin
print ''equal''
end else begin
print ''not equal''
end
-- output:
-- not equal
... en donde cláusula
declare @example table (ValueA nvarchar(1), ValueB nvarchar(1))
insert into @example (ValueA, ValueB)
values (''a'', ''A''),
(''a'', ''a''),
(''a'', ''b'')
select ValueA + '' = '' + ValueB
from @example
where hashbytes(''SHA1'', ValueA) = hashbytes(''SHA1'', ValueB)
-- output:
-- a = a
select ValueA + '' <> '' + ValueB
from @example
where hashbytes(''SHA1'', ValueA) <> hashbytes(''SHA1'', ValueB)
-- output:
-- a <> A
-- a <> b
o para encontrar un valor
declare @value_b nvarchar(1) = ''A''
select ValueB + '' = '' + @value_b
from @example
where hashbytes(''SHA1'', ValueB) = hasbytes(''SHA1'', @value_b)
-- output:
-- A = A
utilice Latin1_General_CS como su intercalación en su sql db
UTILIZAR BINARY_CHECKSUM
SELECT
FROM Users
WHERE
BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)