Konwersja typu danych (aparat bazy danych)

Typy danych mogą być konwertowane w następujących scenariuszach:

  • Po przeniesieniu danych z jednego obiektu do, porównaniu z lub połączeniu z danymi z innego obiektu dane mogą być konwertowane z typu danych jednego obiektu na typ danych drugiego obiektu.

  • Gdy dane z kolumny wyników, kodu powrotnego lub parametru wyjściowego języka Transact-SQL są przenoszone do zmiennej programu, dane muszą być konwertowane z systemowego typu danych programu SQL Server na typ danych zmiennej.

Typy danych mogą być konwertowane niejawnie lub jawnie:

  • Konwersje niejawne nie są widoczne dla użytkownika.

    Program SQL Server automatycznie konwertuje dane z jednego typu na drugi.Na przykład, kiedy wartość typu smallint jest porównywana z wartością typu int, wartość smallint jest niejawnie konwertowana na wartość int przed rozpoczęciem porównania.

  • Konwersje jawne używają funkcji CAST lub CONVERT.

    Funkcje CAST i CONVERT konwertują wartość (lokalną zmienną, kolumnę lub inne wyrażenie) z jednego typu danych na inny.Na przykład, następująca funkcja CAST konwertuje wartość liczbową $157.27 na ciąg znaków '157.27':

    CAST ( $157.27 AS VARCHAR(10) )
    

    Używaj funkcji CAST zamiast CONVERT, jeśli chcesz, aby kod programu w języku Transact-SQL był zgodny z normami ISO.Użyj funkcji CONVERT zamiast CAST, aby skorzystać z opcji stylu dostępnych w funkcji CONVERT.

Niektóre niejawne i jawne konwersje typów danych nie są obsługiwane podczas konwertowania typu danych jednego obiektu programu SQL Server na inny.Na przykład wartość nchar nie może zostać przekonwertowana na wartość image.Wartość nchar może zostać przekonwertowana tylko na wartość binary za pomocą konwersji jawnej; niejawna konwersja na typ binary nie jest obsługiwana.Jednakże wartość nchar może być jawnie lub niejawnie konwertowana na wartość nvarchar.

Podczas przetwarzania danych typu sql_variant program obsługuje SQL Server konwersje niejawne obiektów o innych typach danych na dane typu sql_variant.Jednakże program SQL Server nie obsługuje niejawnej konwersji danych typu sql_variant na obiekty o innych typach danych.

Aby uzyskać więcej informacji na temat obsługiwanych konwersji między obiektami programu SQL Server, zobacz CAST i CONVERT (Transact-SQL).

Podczas konwertowania między zmienną aplikacji a kolumną zestawu wyników, kodem powrotnym, parametrem lub znacznikiem parametru programu SQL Server obsługiwane konwersje typów danych są określane przez interfejs API bazy danych.Aby uzyskać więcej informacji, zobacz Przenoszenie danych do programu zmiennych.

Zachowania podczas konwertowania typów danych

W podrozdziałach poniżej w tym temacie opisano zachowania konwersji demonstrowane przez następujące typy danych:

dane binarne i varbinary

dane walutowe

dane bitowe

dane dziesiętne i liczbowe

Dane znakowe

Typów danych przy użyciu procedur składowanych funkcji automatyzacji OLE

daty i godziny

liczby całkowite

dane zmiennoprzecinkowe i rzeczywiste

Konwertowanie danych binarnych i varbinary

Kiedy dane są konwertowane z typu będącego ciągiem (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext lub image) na typy danych binary lub varbinary o nierównej długości, program SQL Server dopełnia lub obcina dane z prawej strony.Kiedy inne typy danych są konwertowane na typ binary lub varbinary, dane są dopełniane lub obcinane z lewej strony.Dopełnienie osiąga się za pomocą szesnastkowych zer.

Konwertowanie danych na typy binary i varbinary jest użyteczne, jeśli typ binary jest najprostszym sposobem przenoszenia danych.Konwertowanie jakiejkolwiek wartości na wartość binarną o wystarczającym rozmiarze, a następnie z powrotem na oryginalny typ, zawsze spowoduje powstanie tej samej wartości, jeśli obie konwersje odbywają się w tej samej wersji programu SQL Server.Reprezentacja binarna wartości może się zmieniać między wersjami programu SQL Server.

Można przekonwertować dane typu int, smallint i tinyint na dane typu binary lub varbinary, ale po skonwertowaniu wartości binary z powrotem na wartość całkowitą wartość ta będzie się różnić od oryginalnej wartości całkowitej, jeśli nastąpiło obcięcie.Na przykład, następująca instrukcja SELECT wskazuje, że wartość całkowita 123456 jest zazwyczaj przechowywana jako binarna wartość 0x0001e240:

SELECT CAST( 123456 AS BINARY(4) )

Jednakże następująca instrukcja SELECT wykazuje, że jeśli obiekt docelowy danych typu binary jest zbyt mały, aby pomieścić całą wartość, wiodące cyfry dyskretnie są obcinane tak, aby ta sama liczba była przechowywana jako 0xe240:

SELECT CAST( 123456 AS BINARY(2) )

Następująca partia pokazuje, że to dyskretne obcinanie może wpływać na operacje arytmetyczne bez zgłaszania błędu:

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

Wynikiem końcowy jest liczba 57921, nie 123457.

Ostrzeżenie

Rezultaty konwersji między wszelkimi typami danych a typami danych binary nie są gwarantowane między różnymi wersjami programu SQL Server.

Konwertowanie na dane bitowe

Konwertowanie na dane typu bit zmienia każdą wartość niezerową na 1.

Konwertowanie danych znakowych

Gdy wyrażenia znakowe są konwertowane na dane typu znakowego o innym rozmiarze, wartości, które są zbyt długie dla nowego typu danych, są obcinane.

Kiedy wyrażenie znakowe jest konwertowane na wyrażenie znakowe o innym typie lub rozmiarze danych, np. z char(5) na varchar(5) lub z char(20) na char(15), sortowanie wartość wejściowej jest przypisane do przekonwertowanej wartości.Jeśli wyrażenie nieznakowe jest konwertowane na typ danych znakowych, domyślne sortowanie bieżącej bazy danych jest przypisane do przekonwertowanej wartości.W obu przypadkach można przypisać określone sortowanie za pomocą klauzuli COLLATE.

Ostrzeżenie

Translacje stron kodowych są obsługiwane dla typów danych char i varchar, ale nie dla typu danych text.Jak w starszych wersjach programu SQL Server, utrata danych podczas translacji strony kodowej nie jest zgłaszana.

Wyrażenia znakowe, które są konwertowana do przybliżonej wartości o typie danych numeric, mogą zawierać opcjonalny zapis wykładniczy (mała litera e lub wielka litera E, po niej opcjonalny znak plusa (+) lub minusa (-), a następnie liczba).

Wyrażenia znakowe, które są konwertowana do dokładnej wartości o typie danych numeric, muszą składać się z cyfr, przecinka dziesiętnego i opcjonalnego plusa (+) lub minusa (-).Spacje wiodące są ignorowane.Przecinki jako separatory, takie jak separatora tysięcy w liczbie 123,456.00, nie są dozwolone w ciągu.

Wyrażenia znakowe konwertowane na typ money lub smallmoney mogą również zawierać opcjonalny przecinek dziesiętny i znak dolara ($).Przecinki jako separatory, jak w liczbie $123,456.00, są dozwolone.

Poniższy przykład pokazuje sposób konwertowania danych do wyświetlania.W tym przykładzie dane dotyczące sprzedaży są konwertowane do danych znakowych przed wykonaniem porównywania ciągów znaków, po czym bieżąca data jest konwertowana na styl 3, dd/mm/rr.

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';
GO

W tym przykładzie wartość uniqueidentifier jest konwertowana na typ danych char.

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char';
GO

W tym przykładzie bieżąca data jest konwertowana do stylu 3, dd/mm/rr.

SELECT CONVERT(char(12), GETDATE(), 3);
GO

Konwertowanie daty i godziny

Podczas konwertowania typów danych date i time program SQL Server odrzuca wszystkie wartości, których nie może rozpoznać jako daty lub godziny.Aby zapoznać się z omówieniem wszystkich typów oraz funkcji daty i godziny Transact-SQL, zobacz temat Funkcje daty i godziny (Transact-SQL).

Poniższy przykład konwertuje wartości date i datetime2 odpowiednio na typy danych varchar i binary.

DECLARE @mydate date;
SET @mydate = '4/05/98';

SELECT CAST(@mydate AS varchar) AS DATE_VARCHAR;
GO

DECLARE @mydate  datetime2;
SET @mydate     = '4/05/98';

SELECT  CAST(@mydate AS binary) AS DATE_BINARY;
GO

Oto zestaw wyników.

(1 row(s) affected)

DATE_VARCHAR

------------------------------

Apr 5 1998

(1 row(s) affected)

DATE_BINARY

--------------------------------------------------------------

0x0700000000008B210B

(1 row(s) affected)

Konwertowanie danych zmiennoprzecinkowych i rzeczywistych

Wartości typu float są obcinane, gdy są konwertowane na jakikolwiek typ wartości całkowitej.

Jeśli chcesz przekonwertować typ float lub real na dane znakowe, użycie funkcji ciągów STR jest zazwyczaj bardziej użyteczne niż funkcji CAST().Jest to spowodowane tym, że funkcja STR umożliwia większą kontrolę nad formatowaniem.Aby uzyskać więcej informacji, zobacz STR (Transact-SQL) i Funkcje wbudowane (Transact-SQL).

Konwertowanie danych walutowych

Podczas konwertowania na typ money z typów danych całkowitych zakłada się, że jednostki są pieniężne.Na przykład, wartość całkowita 4 jest konwertowana na odpowiednik 4 jednostek pieniężnych w formacie money.

Poniższy przykład konwertuje wartości smallmoney i money odpowiednio na typy danych varchar i decimal.

USE AdventureWorks2008R2;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

Oto zestaw wyników.

SM_MONEY VARCHAR

------------------------------

3148.29

(1 row(s) affected)

MONEY DECIMAL

----------------------

3148

(1 row(s) affected)

Konwertowanie danych dziesiętnych i liczbowych

Dla typów danych decimal i numeric program SQL Server traktuje każdą określoną kombinację dokładności i skali jako inny typ danych.Na przykład decimal(5,5) i decimal(5,0) są uważane za dane różnych typów.

W instrukcjach Transact-SQL stała z przecinkiem dziesiętnym automatycznie jest konwertowane na wartości danych typu numeric przy użyciu minimalnej koniecznej dokładności i skali.Na przykład stała 12.345 jest konwertowana na wartość numeric z dokładnością 5 i skalą 3.

Konwersja z typu decimal lub numeric na typ float lub real może spowodować pewną utratę dokładności.Konwersja z typu int, smallint, tinyint, float, real, money lub smallmoney na typ decimal lub numeric może spowodować przepełnienie.

Domyślnie program SQL Server stosuje zaokrąglenie podczas konwertowania liczby na wartość decimal lub numeric o niższej dokładności i skali.Jednakże, jeśli opcja SET ARITHABORT ma wartość ON, program SQL Server zgłasza błąd po wystąpieniu przepełnienia.Utrata tylko dokładności i skali nie jest wystarczająca do zgłoszenia błędu.

Konwertowanie wartości całkowitych

Gdy liczby całkowite są niejawnie konwertowane na dane znakowe, jeśli liczba całkowita jest zbyt duża, aby zmieściła się w polu znakowym, program SQL Server wprowadza znak ASCII nr 42, czyli gwiazdkę (*).

Stałe będące liczbami całkowitymi większymi niż 2 147 483 647 są konwertowane na typ danych decimal, nie bigint.Poniższy przykład pokazuje, że po przekroczeniu wartości progowej typ danych wyniku zmienia się z int na decimal.

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;

Oto zestaw wyników.

Result1 Result2

1073741823 1073741824.500000

Konwertowanie typów danych przy użyciu procedur składowanych funkcji automatyzacji OLE

Ponieważ program SQL Server korzysta z typów danych języka Transact-SQL, a funkcja automatyzacji OLE korzysta z typów danych programu Visual Basic, procedury składowane funkcji automatyzacji OLE muszą konwertować dane przesyłane między programem a funkcją.

W poniższej tabeli opisano konwersje między typami danych programów SQL Server a Visual Basic.

Typ danych programu SQL Server

Typ danych programu Visual Basic

char, varchar, text, nvarchar, ntext

String

decimal, numeric

String

bit

Boolean

binary, varbinary, image

Jednowymiarowa tablica Byte()

int

Long

smallint

Integer

tinyint

Byte

float

Double

real

Single

money, smallmoney

Currency

datetime, smalldatetime

Date

Jakakolwiek ustawiona na NULL

Wartość Variant ustawiona na Null

Wszystkie pojedyncze wartości programu SQL Server są konwertowane na pojedyncze wartości programu Visual Basic, z wyjątkiem wartości binary, varbinary i image.Te wartości są konwertowane na jednowymiarowe tablice Byte() w programie Visual Basic.Ta tablica zawiera szereg od Byte(0 do length1), gdzie length jest liczbą bajtów w wartościach binary, varbinary lub image programu SQL Server.

Poniżej wymieniono konwersje typów danych programu Visual Basic na typy danych programu SQL Server.

Typ danych programu Visual Basic

Typ danych programu SQL Server

Long, Integer, Byte, Boolean, Object

int

Double, Single

float

Currency

money

Date

datetime

String z 4000 znaków lub mniej

varchar/nvarchar

String z ponad 4000 znaków

text/ntext

Jednowymiarowa tablica Byte() z 8000 bajtów lub mniej

varbinary

Jednowymiarowa tablica Byte() z ponad 8000 bajtów

image