sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008 prázdný řetězec vs. prostor

varchar s a rovnost jsou v TSQL ožehavé. LEN funkce říká:

Vrátí počet znaků, nikoli počet bajtů, daného řetězcového výrazu, bez koncových mezer .

Musíte použít DATALENGTH získat skutečný byte počet dotyčných údajů. Pokud máte data Unicode, mějte na paměti, že hodnota, kterou v této situaci získáte, nebude stejná jako délka textu.

print(DATALENGTH(' ')) --1
print(LEN(' '))        --0

Pokud jde o rovnost výrazů, jsou tyto dva řetězce porovnány z hlediska rovnosti takto:

  • Zkrátit řetězec
  • Vložka s mezerami dokud se délka nerovná délce delšího řetězce
  • Porovnejte oba

Je to prostřední krok, který způsobuje neočekávané výsledky - po tomto kroku efektivně porovnáváte bílé znaky s bílými znaky - proto jsou považovány za stejné.

LIKE chová se lépe než = v situaci „prázdných míst“, protože neprovádí prázdná výplň na vzor, ​​který jste se snažili porovnat:

if '' = ' '
print 'eq'
else
print 'ne'

eq zatímco:

if '' LIKE ' '
print 'eq'
else
print 'ne'

ne

Opatrně s LIKE ačkoli:není symetrický:zachází s koncovými bílými znaky jako s významnými ve vzoru (RHS), ale nikoli se shodným výrazem (LHS). Následující je převzato odtud:

declare @Space nvarchar(10)
declare @Space2 nvarchar(10)

set @Space = ''
set @Space2 = ' '

if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'

if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'

@Space Not Like @Space2
@Space2 Like @Space


  1. MySQL selže na:mysql ERROR 1524 (HY000):Plugin 'auth_socket' není načten

  2. Co se stane, když nepotvrdíte transakci do databáze (řekněme SQL Server)?

  3. cx_Oracle se nepřipojí při použití SID místo názvu služby v připojovacím řetězci

  4. Může spouštěč MySQL simulovat omezení CHECK?