Почему значения, хранящиеся в столбце NVARCHAR, иногда дополняются конечными пробелами? - PullRequest
11 голосов
/ 21 апреля 2011

Приложение, над которым я работаю, хранит строки Unicode в столбце NVARCHAR(50) в базе данных SQL Server 2005.

Иногда база данных возвращает строку, дополненную пробелами до максимальной длины столбца (50).В других случаях заполнение не происходит.

Я думаю, что тип этого столбца изначально был указан как NCHAR, но когда мы поняли, что пробелы добавляются, мы изменили его на NVARCHAR(50).Может ли это иметь какое-либо отношение к этому?

В любом случае, можно ли отключить эту «функцию»?

Уточнение

Я только что понял, что то, что я написал выше, не даетЯсно, что даже недавно вставленные строки заполнены пробелами.

Ответы [ 7 ]

15 голосов
/ 21 апреля 2011

NCHAR дополняет поле, NVARCHAR нет. Но если данные взяты из старого поля, то пробелы останутся до усечения.

7 голосов
/ 21 апреля 2011

«Устаревшие» пробелы, вызванные типом nchar, ранее сохранялись из-за SET ANSI_PADDING ON , который используется по умолчанию.

Вам нужно ОБНОВИТЬ RTRIM, чтобы удалить завершающие пробелы.

7 голосов
/ 21 апреля 2011

Если вы ранее преобразовали их из NCHAR в NVARCHAR, любые ранее введенные данные будут по-прежнему содержать завершающие пробелы. Вы можете обновить их все:

UPDATE tablename
SET column = RTRIM(column)
1 голос
/ 14 июля 2011

Как вы получаете значения в таблицу? Я думаю, что возможно, если у вас есть сохраненный процесс и вы явно задаете длину параметра, который обновляет этот столбец, равным 50 (скажем, через SqlCommand), он в конечном итоге заполнит его уже на стороне ADO.NET.

1 голос
/ 21 апреля 2011

NCHAR столбцы дополняются пробелами, потому что CHARACTER - это тип данных фиксированной ширины, требуемый стандартом SQL:

Если VARYING не указано в <character string type>, то длина в символах строки символов фиксирована и это значение <length>.

и

Пусть T и V будут TARGET и VALUE, указанными в заявке это Subclause

Если тип данных T является символьной строкой фиксированной длины с длина в символах L и длина в символах M из V меньше L, тогда первые M символов T установлены в V и последние L-M символов T установлены на <space> с.

Обратите внимание, что ANSI_PADDING = ON (по умолчанию) функции и выражения, кроме конкатенации и сравнения, неявно усекают конечные пробелы в VARCHAR аргументах:

SELECT  LEN(a), LEN(b), LEN(a + b)
FROM    (
        VALUES
        (CAST('a ' AS VARCHAR(100)), CAST('b' AS VARCHAR(100)))
        ) AS q(a, b)

-----------
1    1    3
1 голос
/ 21 апреля 2011

Иногда вы можете сделать это:

Update MyTable Set MyColumn = LTRIM(RTRIM(MyColumn));
0 голосов
/ 07 ноября 2018

Я наткнулся на эту тему, пытаясь решить точно такую ​​же проблему, и опубликую свое решение.

Я использовал NChar, поскольку это моя первая база данных SQL, и я не знал о дополняемых пробелах. Затем я создал класс LINQ-to-SQL, чтобы обеспечить доступ к моей базе данных. Когда я позже обновил свою базу данных, я не обновил свой класс LINQ-to-SQL, поэтому в нем все еще был NChar. Я изменил их, чтобы решить проблему.

Если вы не использовали этот точный метод, у вас может быть аналогичное решение для вашего метода. То, что вы используете для добавления записей, не было обновлено.

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