Если я запишу строку в таблицу SQL Server с помощью Entity Framework (перенес существующую базу данных в EF), а затем измерю длину строки в SQL Server Management Studio, моя строка окажется слишком длинной. Похоже, что различные типы сортировки добавляют кучу пробелов в конце строки.
Нужно ли явно задавать тип сопоставления для EF? Если да, то есть ли метод лучше, чем это?
Получил сопоставление по умолчанию:
SELECT SERVERPROPERTY('collation') SQLServerCollation
результат:
SQL_Latin1_General_CP1_CI_AS
Я измерил строку следующим образом (возвращает 51 символ, когда строка «Билл»):
SELECT
LEN(CONCAT(first_name, '!' COLLATE SQL_Latin1_General_CP1_CI_AS))
FROM
[GreenCardSite].[dbo].[AppUser]
WHERE
user_id = 16840
Обратите внимание, что ! добавляется в конец строки, потому что по умолчанию SQL Server не измеряет пробелы при вычислении длины. Далее, когда я запустил это без указания сортировки, я получил ошибку:
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_100_CI_AS" in the concat operation.
AppUser
класс EF:
[Table("AppUser")]
public partial class AppUser
{
[Key]
public int user_id { get; set; }
[StringLength(50)]
public string first_name { get; set; }
[StringLength(50)]
public string last_name { get; set; }
.....
Интересный. Я не знаю, что происходит. Вы уверены, что это не связано с настройкой ANSI_PADDING? docs.microsoft.com/en-us/sql/t-sql/statements/…
А почему вы думаете, что в конце столбца нет пробела?
@DavidG, я добавил частичное объявление класса выше. И я уверен, что пробела нет, потому что я обновил значение явно с помощью EF и жестко закодировал строку «Билл» перед запуском тестов.
Обратите внимание, что это не имеет ничего общего с Entity Framework, что такое базовый тип SQL?
@Ben Я только что проверил, и для ANSI_PADDING установлено значение ON.
@DavidG В сервере sql тип char (50)
Проблема не в вашей сортировке. Тип вашего столбца — CHAR(50)
. В столбце этого типа остальная часть содержимого поля дополняется пробелами, поэтому вместо Bill
у вас фактически есть Bill____________________________________
.
Поэтому вам либо нужно изменить тип данных на VARCHAR(50)
, либо вам нужно будет обрезать пробелы:
SELECT len(concat(rtrim(first_name), '!'))
FROM [GreenCardSite].[dbo].[AppUser]
WHERE user_id = 16840
Какой тип данных столбца для
AppUser
?