【问题标题】:CHAR behavior with trailing spaces带有尾随空格的 CHAR 行为
【发布时间】:2010-12-17 21:38:30
【问题描述】:

鉴于下面的 SQL 语句,我希望查询的结果是:

|testX|5|
|XXXXX|5|

这是因为该列是 char(5),我希望它插入空白尾随空格来填充列中的剩余空间,因为插入的值少于五个字符。但是,查询实际上会产生以下结果:

|test|4|
|X|0|

谁能解释一下。为什么没有用尾随空格填充值以使它们填满长度为 5 的列?当第二个值是一个完全空的字符串时,为什么 REPLACE 函数会为第二个值插入一个 X?

USE Test;
GO

SET ANSI_PADDING ON;
GO

CREATE TABLE BlankTest
(
    Value char(5) NOT NULL
);
GO

INSERT INTO BlankTest (
    Value
) VALUES (
    'test'
);
GO

INSERT INTO BlankTest (
    Value
) VALUES (
    ''
);
GO

SELECT REPLACE(Value, ' ', 'X'), LEN(Value)
FROM BlankTest;
GO

DROP TABLE BlankTest;

【问题讨论】:

    标签: sql sql-server sql-server-2005 types


    【解决方案1】:

    REPLACE 返回 varchar

    为 SELECT 试试这个

    ...REPLACE(Value, ' ', 'ZZZZZZZZZ')
    

    这当然不能是char(5),那是什么

    ...SQL_VARIANT_PROPERTY (REPLACE(Value, ' ', 'ZZZZZZZZZ'), 'MaxLength')...
    

    8000,最大 varchar...

    编辑:

    1. 我聪明的 alec 同事提醒我,您需要使用 DATALENGTH 来包含尾随空格,而不是 LEN。 Asked often here

    2. WHERE value = 'test'。这里的 'test' 是 varchar,它有一个 higher precedence (fixed) 而不是 char,所以该列被转换为 varchar,从而有效地截断

    【讨论】:

    • 好的,但是给定相同的数据,如果我执行 SELECT * FROM BlankTest WHERE Value = 'test';我得到一排返回。我不应该收到零行,因为带有填充的插入值将是'test'和'test'!='test'。
    • 太好了,谢谢。您是否有任何有关数据类型优先级的文档的链接?您为更高优先级添加的链接链接到与上面针对 datalength 与 len 的链接相同的问题,并且没有讨论优先级问题。
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2015-11-15
    • 2021-09-08
    • 1970-01-01
    • 2013-04-03
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多