【问题标题】:try to concatenate 2 strings, result ends in a lot of spaces尝试连接 2 个字符串,结果以很多空格结尾
【发布时间】:2020-08-18 11:12:01
【问题描述】:
select CONCAT(convert(char, 123), 'sda');

或者

select convert(char, 123) + 'sda'

或者

select ltrim(convert(char, 123) + 'sda')

输出是:

我怎样才能得到没有这些空格的输出?

【问题讨论】:

标签: sql sql-server string tsql


【解决方案1】:

这里的问题是 2 倍。首先,您要转换为char,这是一个固定宽度 数据类型,其次,您没有定义char 的长度,因此使用默认长度。对于CASTCONVERT,这是char(30)

所以,你必须从convert(char, 123) 开始。这会将 int 123 转换为 固定宽度 字符串 '123 '。然后将varchar(3)'sda' 连接到该值,得到'123 sda'。这完全按照书面说明工作,但显然不是您想要的。

显而易见的解决方法是使用varchar 并定义一个长度,例如CONCAT(CONVERT(varchar(5),123),'sda'),它将返回'123sda',但是,所有CONCAT 函数的参数都是字符串类型:

字符串值

要连接到其他值的字符串值。 CONCAT 函数需要至少两个 string_value 参数,并且不超过 254 个 string_value 参数。

这意味着您只需传递值123,它就会被隐式转换为字符串类型:CONCAT(123,'sda')


也重申一下我的评论链接:Bad Habits to Kick : Declaring VARCHAR without (length)

【讨论】:

    【解决方案2】:

    您正在使用char,而您可能想要[n]varchar(...):前者用空格填充字符串,而后者则没有:

    concat(convert(varchar(10), 123), 'sda');
    

    但更简单:concat() 默认情况下强制将其参数转换为正确的数据类型,所以应该这样做:

    concat(123, 'sda')
    

    【讨论】:

      【解决方案3】:

      首先,在 SQL Server 中,永远不要使用 char 或没有长度的相关字符串定义。 SQL Server 需要一个长度,默认值取决于上下文。如果你依赖于默认长度,你的代码就会有一个 bug 正在等待发生。

      其次,char 几乎从来都不是你想要的。它是一个固定长度的字符串,较短的字符串用空格填充。

      如果您想要显式转换,请使用varchar,可变长度字符串:

      select convert(varchar(255), 123) + 'sda'
      

      或者省略显式转换,使用concat()

      select concat(123, 'sda')
      

      【讨论】:

        【解决方案4】:

        正如其他人已经指出问题的根本原因,如果您无法编辑数据类型,您始终可以使用SELECT CONCAT(TRIM(CONVERT(char,123)),'sda')。虽然强烈建议使用varchar(n) 或提供char 的独占长度,因为创建固定长度的字符串然后使用TRIM 减少长度是没有意义的。 varchar(30) 非常适合这里,因为长度仍然不能超过 30 个符号,但如果字符串较短,则不会使用所有长度。

        【讨论】:

          【解决方案5】:

          让我们参考微软文档:

          如果在数据定义或变量声明语句中未指定 n,则默认长度为 1。如果在使用 CAST 和 CONVERT 函数时未指定 n,则默认长度为 30。

          参考:https://docs.microsoft.com/en-us/sql/t-sql/data-types/char-and-varchar-transact-sql?view=sql-server-ver15#remarks

          所以,你有Convert(char, 123),而你没有为char指定n,所以你的代码等于Convert(char(30), 123)

          现在很清楚为什么你有很多空格字符。要解决此问题,只需使用变体长度字符数据类型,例如 varchar,但是我建议您始终使用具有长度的字符数据类型。 (与@GordonLinoff 发布的内容相同:https://stackoverflow.com/a/63467483/1666800

          select convert(varchar, 123) + 'sda'
          

          【讨论】:

            猜你喜欢
            • 2013-05-24
            • 1970-01-01
            • 2013-04-07
            • 2010-12-23
            • 1970-01-01
            • 2018-02-25
            • 1970-01-01
            • 2011-06-06
            • 2015-06-10
            相关资源
            最近更新 更多