当我使用此查询时:
SELECT TOP 20
f.name as f_firm_name
FROM Firm f
WHERE f.id_city = '73041' COLLATE SQL_Latin1_General_Cp1251_CI_AS
ORDER BY f.name ASC
我得到了这些结果:
f_firm_name
--------------------------------
SKY LINE STUDIO
АНТИКВАРНЫЙ САЛОН
БИЗОН УЛЬЯНОВСК
ВЕРТЕКС ЗАО
ВОЗРОЖДЕНИЕ+
ВОЛГАСПЕЦТЕХНОЛОГИИ
ГП СЕРВИС
Данилов А.Б.ИП
ИНИКОМ
ИП МАЛАШИН В.Б.
ИП СУЛАГАЕВ АНДРЕЙ
(20 row(s) affected)
但是如果我使用这个查询:
SELECT TOP 20
f.name as f_firm_name
FROM Firm f
WHERE f.id_city='73041'
AND f.name LIKE 'ВЕРТЕКС ЗАО%' COLLATE SQL_Latin1_General_Cp1251_CI_AS
ORDER BY f.name ASC
我得到了这些结果:
f_firm_name
-----------------
(0 row(s) affected)
如果在第一个查询中我得到0 rows
并使用该结果在第二个查询中进行搜索,为什么我会收到f.name
?
答案 0 :(得分:4)
可能,f_firm_name
中的第一个字符 - 是一个空格。
所以试试这个 -
SELECT TOP 20 f_firm_name = f.name
FROM dbo.Firm f
WHERE f.id_city = '73041'
AND LTRIM(f.name) LIKE 'ВЕРТЕКС ЗАО%' --<--
COLLATE SQL_Latin1_General_Cp1251_CI_AS
ORDER BY f.name
答案 1 :(得分:1)
可能您的数据库的默认排序规则不支持字符串文字中的字符,并且它们正在丢失。
根据我的默认排序规则SELECT 'ВЕРТЕКС ЗАО'
返回??????? ???
如果列nvarchar
使用LIKE N'ВЕРТЕКС ЗАО%'
如果varchar
使用
LIKE CAST(N'ВЕРТЕКС ЗАО%' COLLATE SQL_Latin1_General_Cp1251_CI_AS AS VARCHAR(50))
因为这可以防止隐式转换并且是可以攻击的。