Beskrivelse av UTF-8 datalagring i SQL Server


Sammendrag


Noen programmer (spesielt de som er Web-basert) må håndtere Unicode-data som er kodet med UTF-8-koding metoden. SQL Server 7.0 og SQL Server 2000 bruker en annen Unicode-koding (UCS-2) og gjenkjenner ikke UTF-8 som gyldig tegndata. Denne artikkelen diskuterer alternativer for håndtering av denne situasjonen.

Hvis du vil ha mer informasjon


Unicode-data kan kodes på mange forskjellige måter. UCS-2 og UTF-8 er to vanlige måter å lagre bit mønstre som representerer Unicode-tegn. Microsoft Windows NT, SQL Server, Java, COM, og SQL Server ODBC-driveren og OLEDB-leverandøren alle representerer internt Unicode-data som UCS-2.

Alternativer for å bruke SQL Server 7.0 eller SQL Server 2000 som en bakserveren for et program som sender og mottar Unicode-data som er kodet som UTF-8 omfatter:

  1. Hvis programmet bruker Active Server Pages (ASP), og du bruker Internet Information Server (IIS) 5.0 og Microsoft Windows 2000, kan du legge til "< % Session.Codepage=65001% >" ASP-skript på serversiden. Dette angir at IIS til å konvertere alle dynamisk genererte strenger (eksempel: Response.Write) fra UCS-2 til UTF-8 automatisk før de sendes til klienten.

    Hvis du ikke vil aktivere økter, kan du også bruke direktivet serversiden "< % @ CodePage = 65001% >".

    UTF-8 data sendt fra klienten til serveren via GET eller POST er også automatisk konvertert til UCS-2. Egenskapen Session.Codepage er den anbefalte metoden for å håndtere UTF-8-dataene i en web-applikasjon. Denne Codepage-innstillingene er ikke tilgjengelige i IIS 4.0 og Windows NT 4.0. Hvis du vil ha mer informasjon, kan du se følgende artikkel i Microsoft Knowledge Base:
    254313 -feilmelding: feil for Active Server Pages ' ASP 0203' Ugyldig kode
  2. Oversette til og fra UCS-2- eller UTF-8 som passer i det aktuelle programmet. Eksempelkode for denne konverteringen ligger hos den Unicode Consortium:

    Du finner en beskrivelse av algoritmen for å konvertere UCS-2 til UTF-8 i Internett-forespørsel etter kommentarer dokumentet RFC2279.

    På Windows NT eller Windows 2000, kan du bruke funksjonene Win32 MultiByteToWideChar og WideCharToMultiByte for å konvertere UTF-8 til og fra UCS-2 ved å sende den konstante CP_UTF8 (65001) som den første parameteren til funksjoner.
  3. Endre programmet til å bruke UCS-2 i stedet for UTF-8-koding.
  4. Lagre de faktiske dataene som UTF-8 på serveren ved hjelp av VARBINARY/binær/bilde-kolonner. Datalagring på SQL Server UTF-8, betyr det at du ikke kan bruke SQL Server til å sortere eller finne områder med disse verdiene som om dataene var gyldig tegndata. Hvilke typer operasjoner på kolonner med UTF-8-data som ikke returnerer forventede resultatene inkludere "ORDER BY", større-enn ">" og mindre-enn "<" sammenligninger og innebygde SQL Server streng manipulasjon funksjoner for eksempel SUBSTRING().

    Likhet sammenligninger, vil imidlertid fungere så lenge strengene som sammenlignes er like på en byte nivå. Vær oppmerksom på at hvis du lagrer data i UTF-8 i SQL Server ikke bør du bruke character-kolonner (CHAR/NCHAR/VARCHAR og så videre). UTF-8 er ikke gyldig tegndata til SQL Server, og ved å lagre data ikke tegn i character-kolonner risikerer du oppstår problemer, for eksempel problemene som er beskrevet i følgende Microsoft Knowledge Base-artikler:
    155723 INF: SQL Server avkorting av en DBCS-streng
    234748 PRB: SQL Server ODBC-driveren konverterer språk hendelser til Unicode
    Hvis du vurderer dette alternativet, må du huske at hvis du trenger tilgang til UTF-8-data som er lagret i SQL Server fra et annet program enn en webleser (for eksempel fra en ikke-Web-baserte ODBC-program) du trenger å gjøre konvertering fra UTF-8 og UCS-2 i dette programmet som ODBC, OLEDB, COM, Win32 API-kall, VB og C fungerer runtime streng manipulasjon funksjoner ikke med UTF-8-data. Dette flytter belastningen med oversettelse til et annet program.
  5. Hvis dine krav ikke inkluderer behovet for å lagre data fra en kombinasjon av språk som ikke kunne behandles av en enkelt tegntabell, må du kanskje ikke bruke Unicode.
Unicode-støtte ble introdusert på SQL-serveren starter med SQL Server 7.0. Siden SQL Server 6.5 ikke støtter lagring av Unicode-data, er bare alternativene for SQL Server 6.5 beskrevet i trinn 4 og 5.