ฉันต้องการค้นหาแบบตรงตามตัวพิมพ์เล็ก - ใหญ่ในเคียวรี SQL ของฉัน แต่โดยค่าเริ่มต้น SQL Server จะไม่พิจารณาถึงกรณีของสตริง
แนวคิดใด ๆ เกี่ยวกับวิธีค้นหาการค้นหาขนาดตัวพิมพ์เล็กและใหญ่ในแบบสอบถาม SQL?
ฉันต้องการค้นหาแบบตรงตามตัวพิมพ์เล็ก - ใหญ่ในเคียวรี SQL ของฉัน แต่โดยค่าเริ่มต้น SQL Server จะไม่พิจารณาถึงกรณีของสตริง
แนวคิดใด ๆ เกี่ยวกับวิธีค้นหาการค้นหาขนาดตัวพิมพ์เล็กและใหญ่ในแบบสอบถาม SQL?
คำตอบ:
สามารถทำได้ผ่านทางเปลี่ยน Collation โดยค่าเริ่มต้นมันเป็นกรณีตาย
ตัดตอนมาจากลิงค์:
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
/schwarz-weiß
กับ:/schwarz-weiss
โดยใช้การเรียงหน้าหรือการคัดเลือกเป็นไบนารีเช่นนี้
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
มีการทำซ้ำชื่อผู้ใช้ / รหัสผ่านเพื่อให้โปรแกรมสามารถใช้ดัชนีได้ การเปรียบเทียบข้างต้นเป็นการเปรียบเทียบ Case Sensitive เปลี่ยนเป็นสิ่งที่คุณต้องการหากจำเป็น
ประการที่สองการคัดเลือกเป็นไบนารี่สามารถทำได้ดังนี้:
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
like "*word or phrase*"
ค้นหา SQL ทั่วไปจะถูกแทรก
คุณสามารถสร้างแบบสอบถามโดยใช้การแปลงเป็น varbinary - ง่ายมาก ตัวอย่าง:
Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD')
ใช้ BINARY_CHECKSUM
SELECT
FROM Users
WHERE
BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)
ใช้ 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
... ในส่วนที่
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
หรือเพื่อหาค่า
declare @value_b nvarchar(1) = 'A'
select ValueB + ' = ' + @value_b
from @example
where hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)
-- output:
-- A = A
ใช้ Latin1_General_CS เป็นการเปรียบเทียบใน sql db ของคุณ
ใน MySQL ถ้าคุณไม่ต้องการเปลี่ยนการเรียงและต้องการทำการค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ให้ใช้คีย์เวิร์ดbinaryดังนี้
SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter
select * from incidentsnew1
where BINARY_CHECKSUM(CloseBy) = BINARY_CHECKSUM(Upper(CloseBy))
อย่างที่คนอื่นพูดคุณสามารถทำการค้นหาแบบตรงตามตัวพิมพ์ หรือเพียงแค่เปลี่ยนรูปแบบการจัดเรียงของคอลัมน์ที่ระบุเป็นฉัน สำหรับคอลัมน์ User / Password ในฐานข้อมูลของฉันฉันเปลี่ยนเป็น collation ผ่านคำสั่งต่อไปนี้:
ALTER TABLE `UserAuthentication` CHANGE `Password` `Password` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL;