为什么 SQL 服务器在我使用 LIKE 运算符时出错?

Why SQL Server has error when i use LIKE operator?

我想select名第三个字是'l'的员工(如下图) 执行后,有4条正确记录,1条错误记录。 我不明白为什么名字是 'Philip' 而 l 是第四个字符的记录是 selected?

My SQL Statements

您的数据

declare @employee TABLE (
   fname VARCHAR(20) NOT NULL 
  ,lname VARCHAR(20) NOT NULL
);
INSERT INTO @employee(fname,lname) VALUES ('Helen','Bennett');
INSERT INTO @employee(fname,lname) VALUES ('Helvetius','Nagy');
INSERT INTO @employee(fname,lname) VALUES ('Palle','Ibsen');
INSERT INTO @employee(fname,lname) VALUES ('Philip','Cramer');
INSERT INTO @employee(fname,lname) VALUES ('Roland','Mendel');

使用 CHARINDEX 和 SUBSTRING 在列中搜索特定字符会好得多。此外,您必须在 table 中选择最佳整理(数据的排序规则、大小写和区分重音的属性),例如 COLLATE SQL_Latin1_General_CP1_CS_AS 子串

select concat(fname,' ',lname) as fullname
FROM @employee  e  
where SUBSTRING(fname, 3, 1)='l' and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname

CHARINDEX

select concat(fname,' ',lname) as fullname
FROM @employee  e  
where CHARINDEX('l', fname) = 3 and fname SQL_Latin1_General_CP1_CS_AS
ORDER BY e.fname

是的,这是一个特定于 COLLATION 的问题,那些乱给负面评价的人应该多想想,而不是本能地投票!

使用 Vietnamese_100_... 归类(我认为我们的用户 HaNgocHieu 就是这种情况)或其他一些归类如 Welsh_100... Ph 两个字母被视为只有一个,结果是查询 returns 也是 Philip.

作为测试:

CREATE TABLE #employee  
( fname VARCHAR(20) NOT NULL,
  lname VARCHAR(20) NOT NULL);

INSERT INTO #employee(fname,lname) 
VALUES ('Philip','Cramer');

SELECT *
FROM  #employee  e  
where fname + lname COLLATE Vietnamese_CI_AI LIKE '__l%';

fname                lname
-------------------- --------------------
Philip               Cramer

SELECT *
FROM  #employee  e  
where fname + lname COLLATE French_CI_AI LIKE '__l%';

fname                lname
-------------------- --------------------

SELECT *
FROM  #employee  e  
where fname + lname COLLATE Welsh_100_CI_AI LIKE '__l%';


fname                lname
-------------------- --------------------
Philip               Cramer

所以SQL服务器没有错误,HaNgocHieu也没有出错,但是使用非特定数据的特定排序规则可能会导致一些问题,可以使用像拉丁语中的国际排序规则来解决