使用 LIKE 的 StartsWith 查询在非 ascii 列上返回错误的结果

5 sql-server collation like

我想查询以特定文本片段开头的条目的表。

我的印象是 LIKE 运算符是执行此操作的一种方法,因此如果我想查找具有以“a”开头的 Column2 的所有行,那么我将使用如下查询来执行此操作

SELECT Column1, Column2, Column3
FROM Table1
WHERE Column2 LIKE 'a%';
Run Code Online (Sandbox Code Playgroud)

我发现使用这样的查询会返回意外的结果。

下面是一个例子:

CREATE DATABASE TestDB;
GO

USE TestDB;
GO

CREATE TABLE TestTable
(
    Id INT NOT NULL,
    Romanian NVARCHAR(MAX) COLLATE SQL_Romanian_CP1250_CI_AS NOT NULL,
    English  NVARCHAR(MAX) NOT NULL
);
GO

SET NOCOUNT ON;

INSERT TestTable SELECT 1, N'da', 'yes';
INSERT TestTable SELECT 2, N'ani', 'years';
INSERT TestTable SELECT 3, N'a avea', 'to have';
INSERT TestTable SELECT 4, N'a fi', 'to be';
INSERT TestTable SELECT 5, N'?ase', 'six';
INSERT TestTable SELECT 6, N'?apte', 'seven';
INSERT TestTable SELECT 7, N'opt', 'eight';  
INSERT TestTable SELECT 8, N'zece', 'ten';
INSERT TestTable SELECT 9, N'nu', 'no';
GO

SELECT *
FROM TestTable
WHERE Romanian LIKE 'a%';

USE master;
GO

DROP DATABASE TestDb;
GO
Run Code Online (Sandbox Code Playgroud)

我期待这会返回以下内容

+----+-------------+----------+
| Id | Romanian    | English  |
+----+-------------+----------+
| 2  | ani         | years    |
+----+-------------+----------+
| 3  | a avea      | to have  |
+----+-------------+----------+
| 4  | a fi        | to be    |
+----+-------------+----------+
Run Code Online (Sandbox Code Playgroud)

但它返回了这个

+----+-------------+----------+
| Id | Romanian    | English  |
+----+-------------+----------+
| 2  | ani         | years    |
+----+-------------+----------+
| 3  | a avea      | to have  |
+----+-------------+----------+
| 4  | a fi        | to be    |
+----+-------------+----------+
| 5  | ?ase        | six      |
+----+-------------+----------+
| 6  | ?apte       | seven    |
+----+-------------+----------+
Run Code Online (Sandbox Code Playgroud)

我的版本号是 13.0.1601.5

Mar*_*ith 6

提供 SQL 排序规则只是为了向后兼容。

10 多年来,情况一直如此。

使用更现代的归类,例如Romanian_100_CI_AS.

这不会产生这种行为。