代码之家  ›  专栏  ›  技术社区  ›  Rilcon42

使用错误字符串编码的实体框架?

  •  1
  • Rilcon42  · 技术社区  · 6 年前

    如果我使用实体框架(将现有数据库迁移到EF)将字符串写入SQL Server表,然后在SQL Server Management Studio中测量字符串长度,则说明我的字符串太长。不同的排序规则类型似乎在字符串的末尾添加了一堆空白。

    是否必须显式设置ef的排序规则类型?如果是这样,有没有比 this ?

    获取默认排序规则:

    SELECT SERVERPROPERTY('collation') SQLServerCollation
    

    结果:

    SQL_Latin1_General_CP1_CI_AS 
    

    我这样测量了字符串(当字符串为“bill”时返回51个字符):

    SELECT 
        LEN(CONCAT(first_name, '!' COLLATE SQL_Latin1_General_CP1_CI_AS))
    FROM 
        [GreenCardSite].[dbo].[AppUser]
    WHERE
        user_id = 16840
    

    注意!添加到字符串结尾,因为默认情况下,SQL Server在计算长度时不测量空白。此外,当我在不指定排序规则的情况下运行此命令时,我得到一个错误:

    无法解决concat操作中“sql拉丁1_general_cp1_ci_as”和“拉丁1_general_100_ci_as”之间的排序规则冲突。

    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; }
        .....
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   DavidG    6 年前

    这个问题与你的整理无关。您的列类型是 CHAR(50) .在该类型的列中,字段的其余内容用空格填充,因此 Bill 你真的有 Bill____________________________________ .

    因此,您要么需要将数据类型更改为 VARCHAR(50) 或者需要修剪空间:

    SELECT len(concat(rtrim(first_name), '!'))
    FROM [GreenCardSite].[dbo].[AppUser]
    WHERE user_id = 16840