【问题标题】:SqlServer selected column data padded with unwanted whitespaceSql Server 选择用不需要的空格填充的列数据
【发布时间】:2018-10-08 03:18:14
【问题描述】:

我发现了一些我从未见过的数据库引擎。 数据库中有一个表,假设该表有几个 nchar(50) 列。比如名字,姓氏。 我在表中插入一行。 然后我通过选择行来取回数据。现在数据用空格填充,所以它有 50 个字符长。

看这个! 'MyName' 变为 'MyName '

虽然我不希望这种操纵行为,但我也认为这是不可接受的。简单地说,它只是在我无意的情况下更改我的数据。

我能做些什么来解决这个问题?如果答案是:只需修剪从数据库结果中获得的字符串,那我就失望了。 如果我的原始数据确实在末尾包含空格,我不想丢失它们怎么办?

我做错了什么?

【问题讨论】:

  • 改用varchar

标签: .net sql-server database database-design data-storage


【解决方案1】:

将您的数据类型从 nchar(50) 更改为 nvarchar(50)。 nchar(50) 将产生 value 的字符数并保留空格。 'MyName' 有 6 个字符,剩下的 44 个字符将是空格。

【讨论】:

    【解决方案2】:

    引用char and varchar (Transact-SQL)

    • 当列数据条目的大小一致时使用 char。
    • 当列数据条目的大小变化很大时使用 varchar。
    • 当列数据条目的大小变化很大且大小可能超过 8,000 字节时,请使用 varchar(max)。

    重点是我的。

    如果您有一个 char(10) 列,那么如果您使用少于 10 个字符,则该字符串将被“填充”出来。例如,存储在char(10) 中的'a' 将变为'a '

    使用可变大小时,请使用varchar(var 表示可变)。这意味着不会填充该值。因此使用varchar(10)'a' 将存储为'a'

    【讨论】:

      【解决方案3】:

      这正是预期的:

      char/nchar 是固定长度

      varchar/nvarchar 是可变长度的

      您还应该检查 SET ANSI_PADDING ON/OFF 以设置 sql server 如何处理 varchar 列中的尾随空格。

      SET ANSI_PADDING ON 不会修剪 varchar 列中的尾随空格(如果存在)

      SET ANSI_PADDING OFF 将修剪 varchar 列中的尾随空格(如果存在)

      【讨论】:

        猜你喜欢
        • 2017-04-15
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        相关资源
        最近更新 更多