C# 实体框架使用错误的字符串编码?
如果我使用Entity Framework(将现有数据库迁移到EF)将字符串写入SQL Server表,然后在SQL Server Management Studio中测量字符串长度,那么我的字符串太长了。不同的排序规则类型似乎在字符串末尾添加了一堆空白 是否必须显式设置EF的排序规则类型?如果是的话,还有比这更好的方法吗 已获取默认排序规则:C# 实体框架使用错误的字符串编码?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,如果我使用Entity Framework(将现有数据库迁移到EF)将字符串写入SQL Server表,然后在SQL Server Management Studio中测量字符串长度,那么我的字符串太长了。不同的排序规则类型似乎在字符串末尾添加了一堆空白 是否必须显式设置EF的排序规则类型?如果是的话,还有比这更好的方法吗 已获取默认排序规则: SELECT SERVERPROPERTY('collation') SQLServerCollation 结果: SQL_Latin1_Genera
SELECT SERVERPROPERTY('collation') SQLServerCollation
结果:
SQL_Latin1_General_CP1_CI_AS
我这样测量字符串(当字符串为“Bill”时,返回51个字符):
请注意!将添加到字符串的末尾,因为默认情况下,SQL Server在计算长度时不测量空白。此外,当我在没有指定排序规则的情况下运行此命令时,我得到了一个错误:
无法解决concat操作中“SQL\u Latin1\u General\u CP1\u CI\u AS”和“Latin1\u General\u 100\u CI\u 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; }
.....
这个问题与您的排序无关。您的列类型是
CHAR(50)
。在该类型的列中,字段的其余内容用空格填充,因此实际上不是Bill
而是Bill\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
因此,您需要将数据类型更改为VARCHAR(50)
,或者需要修剪空格:
SELECT len(concat(rtrim(first_name), '!'))
FROM [GreenCardSite].[dbo].[AppUser]
WHERE user_id = 16840
AppUser
的列数据类型是什么?很有趣。我不知道发生了什么事。您确定它与ANSI_填充设置无关吗?是什么让你觉得你的专栏结尾没有空格?@DavidG,我在上面添加了分部类声明。我确信没有空白,因为我在运行测试之前使用EF显式更新了值,并硬编码了字符串“Bill”。注意,这与实体框架无关,底层SQL类型是什么?
SELECT len(concat(rtrim(first_name), '!'))
FROM [GreenCardSite].[dbo].[AppUser]
WHERE user_id = 16840