【问题标题】:SQL Server Strings Padded with Whitespace on Insert - why?SQL Server 字符串在插入时用空格填充 - 为什么?
【发布时间】:2012-03-21 03:29:54
【问题描述】:

当我尝试将一些数据插入 SQL Server 时,出现了这些额外的字符

例如我的textBox1.text == "SAMPLE"
那么这就是代码

string qry = "insert into FinalImages (FinalImageName, Date) values(@FinalImageName, @Date)";

SqlConnection c = new SqlConnection(c_string);
//Initialize SqlCommand object for insert
SqlCommand SqlCom = new SqlCommand(qry, c);

SqlCom.Parameters.Add(new SqlParameter("@FinalImageName", SqlDbType.Char, 40)).Value = textBox1.Text;
SqlCom.Parameters.Add(new SqlParameter("@Date", SqlDbType.Char, 40)).Value = DateTime.Now.ToString("MM/dd/yyyy");

但是当我检查表格时,记录是 "SAMPLE ",它添加了 34 个空格字符
应该有什么问题?

【问题讨论】:

标签: c# sql-server sqldatatypes


【解决方案1】:

不要使用 SqlDbType.Char,使用 NVarChar。 Char 是一个固定大小的字符串,用空格填充(一个可怕的怪物)。

【讨论】:

    【解决方案2】:

    您选择了CHAR(40) 作为参数类型。你的意思是VARCHAR(40)

    【讨论】:

      【解决方案3】:

      您正在使用char(40)。这样,您将始终拥有一个长度为 40 的字符串。如果它更短,SQL-Server 将自动用空格填充其余部分。
      Char 通常只用于固定长度的数据,例如客户编号

      在这种情况下,您想使用varchar(40) 来获得可变长度。

      【讨论】:

        【解决方案4】:

        您指定参数长度为 40 个字符,而不是可变长度:

        SqlCom.Parameters.Add(new SqlParameter("@FinalImageName", SqlDbType.Char, ***40***)).Value = textBox1.Text;
        

        所以它有助于填充您提供的值。

        只使用不带长度参数的重载,使用VarChar:

        SqlCom.Parameters.Add(new SqlParameter("@FinalImageName", SqlDbType.VarChar)).Value = textBox1.Text;
        

        【讨论】:

          【解决方案5】:

          运行

          设置 ANSI_PADDING 关闭;

          更全面的信息是SET ANSI_PADDING

          如果您这样做,您将需要更新所有现有记录以使用 ltrim()/rtrim() 删除填充,因为关闭填充不会影响现有记录 RTRIM (Transact-SQL)

          【讨论】:

            猜你喜欢
            • 2012-09-17
            • 2014-12-11
            • 2015-06-22
            • 2011-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多