【问题标题】:C#: DbType.String versus DbType.AnsiStringC#:DbType.String 与 DbType.AnsiString
【发布时间】:2021-11-10 08:06:37
【问题描述】:

我已经接管了一些 C# 代码。

代码正在使用一些使用参数的SQL 访问数据库。

所有字符串参数都输入为DbType.AnsiString,而不是DbType.String

为什么要使用DbType.AnsiString 而不是DbType.String

【问题讨论】:

    标签: c# dbtype


    【解决方案1】:

    AnsiString
    可变长度的非 Unicode 字符流,范围在 1 到 8,000 个字符之间。

    字符串
    表示 Unicode 字符串的类型。

    在数据库中:

    nchar 和 nvarchar 是 unicode

    char 和 varchar 是非 unicode

    【讨论】:

    • +1。为什么会有人 NOE 使用它的 AnsiString 是数据库中的 ansi 非 unicode 字符串?把我当作逻辑来逃避。
    • DbType.AnsiStringDbType.String 的子集吗?
    • 短:支持中文、日文、韩文等多国语言
    • Unicode 可以用不同的编码来表示——有问题的编码是什么?
    【解决方案2】:

    您将使用 ansistring 而不是 string 以避免 SQL Server 数据库中的隐式转换。

    即当您将字符串变量传递给 MSSQL 时,它显示为 nvarchar(max)。鉴于 MSSQL 中设计良好的数据库默认情况下可能使用 varchars 而不是 nvarchars(除非有非拉丁字符集的业务需求)。

    在这种情况下,字符串变量将导致数据库中的隐式转换。这会导致引擎无法使用某些索引并执行全表扫描(数据库性能万恶之源之一)

    【讨论】:

      【解决方案3】:

      为什么要使用 DbType.AnsiString 而不是 DbType.String?

      简答:当您的SqlParameter 指向varchar(或char)数据库列时,您将使用DbType.AnsiString。当您指向nvarchar 列时,请使用DbType.String,因为它的Unicode

      更长的答案: 如果这些映射不准确(例如,将DbType.String 指向varchar(nn) 列,您将在查询计划中看到CONVERT_IMPLICIT 警告,如Pinal Dave 所述:https://blog.sqlauthority.com/2018/06/11/sql-server-how-to-fix-convert_implicit-warnings/

      就我而言SqlParameter.Size 属性似乎也很重要:要完全消除CONVERT_IMPLICIT 警告,我必须正确映射DbType Size .默认的Size 如果省略则“根据指定参数值的实际大小推断”(1),这通常会与实际列大小定义不匹配,并且也会引发警告。

      1. https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter.size?view=netframework-4.7.2

      【讨论】:

      • 当我为 varchar 列省略 Size 时,我没有收到 CONVERT_IMPLICIT 警告。虽然我没有尝试传递比最大数据库列长度更长的字符串。
      • Vasily,感谢您的反馈。我做了一点修改,指出尺寸可能是一个因素(在我的情况下),但可能不是在所有情况下。
      【解决方案4】:

      了解如何使用 Dapper 在 C# 中解决问题:

      SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString);
      SqlMapper.AddTypeMap(typeof(String), DbType.AnsiString);
      

      【讨论】:

        猜你喜欢
        • 2012-08-14
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多