Począwszy od SQL Server 2019 (obecnie w wersji beta / „Community Tech Preview”), dostępna jest natywna obsługa UTF-8 za pośrednictwem nowej serii zestawień UTF-8. JEDNAK możliwość korzystania z UTF-8 nie oznacza, że powinieneś. Istnieją wyraźne wady korzystania z UTF-8, takie jak:
- Tylko pierwsze 128 punktów kodowych ma 1 bajt (tj. Standardowy 7-bitowy zestaw ASCII)
- Następne prawie 2000 punktów kodowych to 2 bajty, stąd brak oszczędności miejsca w porównaniu do UTF-16 /
NVARCHAR
- Pozostałe 63k punktów kodowych w BMP (tj. Zakres U + 0800 - U + FFFF) to wszystkie 3 bajty, stąd 1 bajt większy niż ten sam znak w UTF-16 /
NVARCHAR
.
- Wystarczy powiedzieć: znaki uzupełniające mają 4 bajty w obu kodowaniach, więc nie ma tutaj różnicy spacji
- Podczas gdy możesz zaoszczędzić miejsce za pomocą UTF-8, istnieje bardzo duża szansa, że zrobisz to za sprawą wydajności.
Tak naprawdę sprowadza się to do tego: UTF-8 jest formatem pamięci masowej, który umożliwia systemom 8-bitowym (które zwykle zostały zaprojektowane w oparciu o ASCII i ASCII Extended - strony kodowe) korzystanie z Unicode bez zepsucia czegokolwiek i nie wymagając żadnej modyfikacji istniejącej pliki w celu utrzymania działania. UTF-8 jest wspaniały dla systemów plików i sieci, ale dane przechowywane w SQL Server nie są takie same. Fakt, że dane, które akurat znajdują się głównie (lub całkowicie) w standardowym zakresie ASCII, wymagają mniej miejsca niż te same dane, gdy są przechowywane jako UTF-16 /, NVARCHAR
jest efektem ubocznym. Jasne, to efekt uboczny, który może okazać się przydatny, ale decyzję tę musi podjąć ktoś, kto rozumie zarówno dane, jak i konsekwencje / wady tej decyzji. To jestnie jest to funkcja do użytku ogólnego.
Ponadto głównym przypadkiem użycia dla UTF-8 (w SQL Server) jest kod aplikacji już korzystający z UTF-8, być może już z innym RDBMS, który go obsługuje, i nie ma potrzeby ani możliwości aktualizacji kodu aplikacji / schematu DB używać NVARCHAR
typów danych (dla tabel, zmiennych, parametrów itp.) lub poprzedzać literały ciągów wielkimi literami „N”. Cel jest taki sam, jak przyczyna istnienia UTF-8: włącz kod aplikacji do korzystania z Unicode bez zmiany ogólnej struktury lub renderowania istnienia niepoprawnych danych. Jeśli to opisuje twoją sytuację, użyj UTF-8, ale pamiętaj, że wciąż jest z nim kilka błędów / problemów.
Jeśli nie ma wyraźnej potrzeby, aby Unicode działał bez użycia NVARCHAR
literałów łańcuchowych z literami „N” z prefiksem, wówczas jedynym innym scenariuszem, w którym UTF-8 jest zaletą, jest DUŻO w większości standardowych danych ASCII, które muszą uwzględniać Znaki Unicode, a ty używasz NVARCHAR(MAX)
(co oznacza, że kompresja danych nie będzie działać), a tabela jest często aktualizowana (więc Indeks klastrowanego magazynu kolumn prawdopodobnie nie pomoże).
Aby uzyskać szczegółowe informacje, zobacz mój post:
Natywne wsparcie UTF-8 w SQL Server 2019: Zbawiciel czy fałszywy prorok?