【问题标题】:Entity Framework using wrong string encoding?实体框架使用错误的字符串编码?
【发布时间】:2019-01-23 00:06:10
【问题描述】:

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

我是否必须明确设置 EF 的排序规则类型?如果是这样,有没有比this更好的方法?

得到默认排序规则:

SELECT SERVERPROPERTY('collation') SQLServerCollation

结果:

SQL_Latin1_General_CP1_CI_AS 

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

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

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

无法解决 concat 操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_100_CI_AS”之间的排序规则冲突。

AppUserEF类:

[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; }
    .....

【问题讨论】:

  • AppUser 的列数据类型是什么?
  • 有趣。我不知道发生了什么事。您确定它与 ANSI_PADDING 设置无关吗? docs.microsoft.com/en-us/sql/t-sql/statements/…
  • 那是什么让你觉得你的专栏末尾没有空格?
  • @DavidG,我在上面添加了部分类声明。而且我确定没有空格,因为我在运行测试之前使用 EF 显式更新了值并硬编码了字符串“Bill”。
  • 注意这与Entity Framework无关,底层SQL类型是什么?

标签: c# sql-server entity-framework


【解决方案1】:

问题与您的排序无关。您的列类型是CHAR(50)。在该类型的列中,该字段的其余内容用空格填充,因此您实际上拥有的是 Bill____________________________________,而不是 Bill

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2017-08-14
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多