Поведінка Варчара з пробілами в кінці


14

Коли я використовую Varchar з пробілами, він ігнорує пробіли в кінці.

колишній:

declare @X varchar(50)

Цей ...

set  @X= 'John'

... те саме, що ...

set @X= 'John           '

Він вважає їх рівними. Як я можу змусити систему розпізнавати їх як різні?

Відповіді:


23

Все просто за стандартом ANSI:

Пояснення пробілів пояснено :

SQL Server дотримується специфікації ANSI / ISO SQL-92 (Розділ 8.2, Загальні правила №3) щодо порівняння рядків з пробілами. Стандарт ANSI вимагає прокладки для символьних рядків, що використовуються при порівнянні, щоб їх довжина відповідала перед порівнянням. Прокладка безпосередньо впливає на семантику предикатів пункту WHERE і HAVING та інші порівняння рядків Transact-SQL. Наприклад, Transact-SQL вважає рядки 'abc' та 'abc' еквівалентними для більшості операцій порівняння.

Єдиним винятком із цього правила є присудок LIKE. Коли у правій частині виразу предикату LIKE є значення з проміжком проміжку, SQL Server не додає два значення до однакової довжини до початку порівняння. Оскільки метою предиката LIKE за визначенням є полегшення пошуку шаблонів, а не простих тестів рівності рядків, це не порушує згаданий раніше розділ специфікації ANSI SQL-92.

Ось добре відомий приклад усіх випадків, зазначених вище:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

Ось ще кілька детальних відомостей про проміжні пробіли та LIKEпункт .

АЛЕ якщо ви хочете їх відрізняти - ви можете вирішити використовувати DATALENGTHфункцію замість LEN, тому що

SELECT 1 WHERE LEN('John ') = LEN('John')

поставить вас 1 замість

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

Рішення є

  • використовувати функцію DATALENGTH для різниці між рядками
  • щоб передати рядок у тип NVARCHAR - можливо, краще оголосити цей тип параметром SP

Видовищний пост, нарешті, знайшов хорошу інформацію
Gaspa79

-2

Ви можете просто додати білий простір до свого стану.

set @X= 'John           \n'

Проміжні простори в рядкових функціях


5
\nне має значення в SQL Server. Це не трактується як новий рядок. Це все ж не відповідь на запитання.
Мартін Сміт

@MartinSmith, але це написано в MSDN "Якщо вам потрібно мати пробіли у вашому рядку, вам слід розглянути можливість додавання символу пробілу в кінці, щоб SQL Server не обрізав рядок."
Іпін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.