Поведение CHAR с конечными пробелами - PullRequest
0 голосов
/ 18 ноября 2009

Учитывая приведенные ниже операторы SQL, я ожидаю, что результат запроса будет:

|testX|5|
|XXXXX|5|

Это потому, что столбец является символом (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;

1 Ответ

2 голосов
/ 18 ноября 2009

ЗАМЕНИТЬ возвращает varchar

Попробуйте это для SELECT

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

Конечно, это не может быть char (5), так что же это такое

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

8000, макс варчар ...

Edit:

  1. Мой умный коллега alec напомнил мне, что вам нужно использовать DATALENGTH для включения конечных пробелов, а не LEN. Здесь часто спрашивают

  2. WHERE value = 'test'. 'test' здесь - это varchar, который имеет более высокий приоритет (фиксированный) , чем char, поэтому столбец преобразуется в varchar, таким образом, эффективно обрезая

...