Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 1

Witam.

Spotkałem się z następującym problemem. W bazie danych po imporcie pojawił nam się nvarchar, który w momencie importu i zmiany na varchar wyrzucił błąd. Po analizie okazało się, że na końcu umieszczony został znak: Left-To-Right Override - nchar(8237). 

Niestety jeżeli ten znak występuje w jakimś ciągu znaków, to funkcja replace go nie podmienia. Gdy występuje sam, wówczas replace działa.

Czy ktoś z Was może spotkał się z takim problemem?

create table #test (t1 nvarchar(5))

insert #test values (nchar(8237)),(nchar(103)+nchar(8237)),(nchar(103))

select replace(t1,nchar(8237),nchar(104)) from #test

Z góry dziękuję za pomoc. 

Piotr_Kurman
  • Zapytał
  • @ Piotr_Kurman | 14.03.2019
    • 1
    • 0
    • 0

Odpowiedź (1)

  • 1

Piotrze, funkcja replace operuje na ciągach znaków, więc na jej wynik będzie miało wpływ zastosowane collation (szczególnie zasady porównywania znaków). Ten znak ma za zadanie modyfikować prezentację innych znaków, z którymi występuje - dlatego przy domyślnym collation porównywany samodzielnie przynosi inne wyniki niż w połączeniu z innymi znakami.

W tym przypadku należałoby użyć jednego z binarnych collation, które nie interpretują zależności pomiędzy znakami np. Latin1_General_BIN2:

SELECT REPLACE(NCHAR(8237) COLLATE Latin1_General_BIN2, NCHAR(8237), N'A')

Zwróci oczekiwane 'A'.

  • Odpowiedział
  • @ | 19.03.2019
  • TRENER ALTKOM AKADEMII
Komentarze
Dziękuję bardzo serdecznie za pomoc.
Skomentował : @ Piotr_Kurman ,01.04.2019
  • 1
  • 0
  • 0