Не меняющиеся символы, отступы и LEN () путаница - PullRequest
1 голос
/ 09 октября 2011

Столбец неизменяемых символов C1 дополняет строку пробелами, если сохраняемая строка меньше максимального числа символов, которое может хранить столбец. Таким образом, когда следующий оператор вставляет строку, его строка C1 содержит 80 символов, из которых 74 являются пробелами.

CREATE TABLE MyTable
(
    C1 char(80)
);

INSERT INTO MyTable (C1)
VALUES ('   ABC');

а)

LEN () возвращает количество символов указанной строки выражение, исключая конечные пробелы.

Я понимаю, что эти 74 лишних пробела были добавлены системой баз данных, а не пользователем, но факт остается фактом, что строка содержит эти пробелы, поэтому не имеет смысла для LEN() также включать лишние пробелы в результат?

b) Похоже, что сервер MS Sql не отображает эти 74 лишних пробела в окне результатов запроса. Почему это?

c) В любом случае, я полагаю, когда мы получим эту строку из БД, строка C1 будет содержать все эти дополнительные пробелы?

Спасибо

1 Ответ

4 голосов
/ 09 октября 2011

a) Именно так определяется LEN для работы, используйте DATALENGTH, чтобы получить длину, включая конечные пробелы (но разделите на 2, чтобы получить длину в символах для типов данных Unicode).

Конечный пробел также игнорируется в SQL Server для сравнения на равенство.то есть SELECT * FROM MyTable WHERE C1 = ' ABC' вернет результаты.

b) В SSMS не очень очевидно, что конечные пробелы фактически возвращаются, в результатах в режиме сетки ширина столбца не указывает на это, но если вы копируете и вставляетеC1 в других местах вы увидите, что конечные пробелы фактически сохраняются.

Один из способов увидеть это - использовать DBCC OUTPUTBUFFER

CREATE TABLE MyTable
(
    C1 char(80)
);

INSERT INTO MyTable (C1)
VALUES ('   ABC');

SELECT C1
FROM MyTable

DBCC OUTPUTBUFFER (@@SPID)

Извлечение для меня результатовниже

00000020   00 20 20 20 41 42 43 20 20 20 20 20 20 20 20 20   .   ABC         
00000030   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000040   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000050   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000060   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   

Все пробелы можно увидеть по ABC

c) Да.Смотри (б)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...