Сравнение ASCII при использовании SQL_Latin1_General_CP1_CI_AS

#sql-server #collation

#sql-сервер #сопоставление

Вопрос:

Я запустил запрос ниже, чтобы увидеть, как строки будут сравниваться в SQL Server, поскольку другой запрос, основанный на сравнении полей с этим типом данных, дал результаты, отличные от ожидаемых. Я не был уверен, будет ли угловая скобка считаться меньшим значением, чем число (на основе таблицы ASCII это не так, но хотел проверить). В результате я просмотрел несколько сообщений, касающихся сравнения строк, сопоставления и ожидаемых значений, и все они, похоже, подтверждают, что это не должно работать таким образом. Параметры сортировки в базе данных (как и в поле, вызвавшем проблемы) — SQL_Latin1_General_CP1_CI_AS .

 SELECT   ASCII('<') AS [<]
        ,ASCII('0') AS [0]
        ,CASE WHEN '<0.1' < '0.1' THEN 1 ELSE 0 END AS TEST1
        ,CASE WHEN '<' < '0' THEN 1 ELSE 0 END AS TEST2
        ,CASE WHEN ASCII('<') < ASCII('0') THEN 1 ELSE 0 END AS TEST3
  

Результат:

 <   0   TEST1   TEST2   TEST3
60  48  1       1       0
  

Любые идеи, которые укажут мне правильное направление, будут очень признательны!

Комментарии:

1. Код ASCII и порядок сортировки символов не совпадают. Значение, возвращаемое из ASCII , является согласованным, независимо от сортировки.

2. Спасибо за объяснение, это помогает! В результате вашего ответа я пытался найти таблицу или что-то, что определяет последовательность на основе сопоставления, но, по-видимому, это один из тех хорошо хранимых секретов. Это действительно нормально, когда я знаю, что могу ожидать, что результаты будут согласованными, даже если я на самом деле не знаю, чему они соответствуют.