【问题标题】:Set Ansi_Padding - Doesn't appear to make a difference?设置 Ansi_Padding - 似乎没有什么不同?
【发布时间】:2016-06-04 03:27:09
【问题描述】:

我一直在阅读 char 与 varchar 的差异,我的理解是,如果 ANSI_PADDING 处于打开状态,我应该在查询时预期差异。例如,如果 ANSI_PADDING 处于打开状态,并且我将一列设置为 char(10),我希望当我插入列中时,比如说“a”,它将填充 9 个字符的空格。因此,我读到我不应该能够查询 'a' 的 char 列,但我需要查询 'a_________'(_ 代表空格)。无论如何,下面是一个我不希望返回结果的示例,但确实如此。我一辈子都无法创建一个根据 ANSI_PADDING 是否打开/关闭返回不同结果的示例。

SET ANSI_PADDING ON

DECLARE @table TABLE 
(
 [identity] int identity(1,1)
,[char] char(10) 
,[varchar] varchar(10) 
)


INSERT INTO @table

SELECT 'a', 'a'

SELECT * FROM @table
WHERE [char] = 'a' -- I expect this to not return results...

SELECT * FROM @table
WHERE [varchar] = 'a'

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    比较忽略 char/varchar 数据中的尾随空格,因此您对 'a' 的比较将命中任何仅在尾随空格不同的值('a ''a ' 等)。看看这个查询:

    SET ANSI_PADDING ON
    
    create table #moose (
            charval char(10),
            varcharval varchar(10)
        )
    
    insert #moose select 'one', 'one'
    
    select  '"' + charval + '"',
            '"' + varcharval + '"'
        from #moose
    
    drop table #moose
    

    你会看到 charval 确实是用空格填充的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多