Преобразуване на типове данни (Database Engine), Microsoft Docs

Преобразуването на типа данни се извършва в следните случаи:

Когато премествате, сравнявате или комбинирате данните на един обект с данните на друг обект, данните могат да бъдат преобразувани от един тип в друг.

Когато данните се преместват в програмна променлива от колона с резултати на Transact-SQL, кодове за връщане или изходни параметри, данните трябва да бъдат преобразувани от системен тип данни на SQL Server в типа данни на променливата.

Преобразуването на типове данни може да бъде изрично или неявно.

Неявното преобразуване е скрито от потребителя.

SQL Server автоматично преобразува данни от един тип в друг. Например, ако типът данни smallint се сравнява с типа int, тогава типът smallint се преобразува неявно в типа int преди сравнението.

Явното преобразуване се извършва с помощта на функциите CAST и CONVERT.

Функциите CAST и CONVERT преобразуват стойност (локална променлива, колона или израз) от един тип данни в друг. Например следната функция CAST преобразува числовата стойност $157,27 в символния низ '157,27':

Ако вашият Transact-SQL код трябва да отговаря на изискванията на ISO, използвайте функцията CAST вместо CONVERT. Използването на функцията CONVERT вместо CAST ви дава предимството на допълнителна функционалност.

Някои типове явни и неявни преобразувания на типове данни не се поддържат при преобразуване на тип данни от един обект на SQL Server в тип данни на друг обект. Например стойност от тип nchar не може да бъде преобразувана в стойност от тип image. Типът данни nchar може да се преобразува само в двоичен тип данни и то изрично. Неявното преобразуване в двоичен код не се поддържа. Но типът данни nchar може да бъде преобразуван в типnvarchar както изрично, така и неявно.

Когато обработва типа sql_variant, SQL Server поддържа имплицитното преобразуване на обекти от други типове данни към типа sql_variant. Но SQL Server не поддържа неявни преобразувания от sql_variant към обекти от различен тип данни.

За повече информация относно поддържаните преобразувания на обекти на SQL Server вижте функции CAST и CONVERT (Transact-SQL).

При взаимно преобразуване на променливи на приложение и колони с набор от резултати, кодове за връщане, параметри и маркери за параметри на SQL Server, поддържаните преобразувания на типове данни се определят от API на базата данни. За повече информация вижте Прехвърляне на данни към програмни променливи.

Поведение при преобразуване на тип данни

Следните подраздели на този раздел описват как да конвертирате следните типове данни:

двоични и варбинарни типове данни

тип данни пари

тип данни bit

десетични и числови типове данни

данни от тип Character

типове данни, използващи съхранени процедури на OLE Automation

данни от типа дата и час

тип данни цяло число

тип данни float и real

Преобразуване на двоични и varbinary типове данни

Когато преобразувате данни от тип низ (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext или image) в двоичен или varbinary тип данни с неравна дължина, SQL Server допълва или съкращава данните отдясно. Когато други типове данни се преобразуват в двоични или varbinary, данните остават подплатени или съкратени. Подпълването се извършва с шестнадесетични нули.

Докато двоичният е най-подходящ за обмен на данни, други типове данни се преобразуват най-добре в двоичен или varbinary. трансформацияна всяка достатъчно голяма стойност в двоична и обратно винаги връща оригиналната стойност, ако и двете преобразувания се извършват на една и съща версия на SQL Server. Двоичното представяне на стойността може да варира в зависимост от версията на SQL Server.

Типовете данни int, smallint и tinyint могат да бъдат преобразувани в двоични или varbinary, но ако конвертирате двоична стойност обратно в целочислена стойност, тя ще бъде различна от оригиналната стойност, ако бъде съкратена. Например следният оператор SELECT показва, че целочислената стойност 123456 обикновено се съхранява като двоичен 0x0001e240:

Обаче следният оператор SELECT показва, че ако целевият двоичен тип е твърде малък, за да побере цялата стойност, тогава водещите цифри се съкращават неявно и същото число се съхранява като 0xe240:

Следният пакет показва, че това недекларирано отрязване може да повлияе на аритметичните операции, без да причинява грешка.

Крайният резултат е 57921, но не и 123457.

Забележка

Преобразуването на всеки тип данни в двоични може да варира в зависимост от версията на SQL Server.

Преобразуване в битов тип данни

Преобразуването в битов тип данни увеличава всяка ненулева стойност с 1.

Преобразуване в символни данни

Когато преобразувате знаков израз в символен тип данни с различна дължина, стойностите, които са твърде дълги за новия тип данни, се съкращават.

Ако символен израз се преобразува в знаков израз с различен тип данни или размер, като например от char(5) към varchar(5) или от char(20) към char(15), тогава съпоставянето на входната стойност се присвоява на преобразуваната стойност. Ако несимвален израз се преобразува в символен тип данни, тогава на преобразуваната стойност се присвояват параметрисортира по подразбиране в текущата база данни. И в двата случая необходимото сортиране може да бъде зададено с помощта на клаузата COLLATE.

Забележка

Преобразуването на кодова страница се поддържа за типовете данни char и varchar, но типът данни текст не се поддържа. Както при по-ранните версии на SQL Server, загубата на данни по време на преобразуване на кодова страница не се отчита.

Знаковите изрази, които се преобразуват в приблизителния цифров тип данни, могат да съдържат незадължителна експоненциална нотация (малка e или главна буква E, последвана от незадължителен знак плюс (+) или минус (-) и число).

Знаковите изрази, преобразувани в точния числов тип данни, трябва да се състоят от цифри, десетичен разделител и незадължителен знак плюс (+) или знак минус (-). Водещите интервали се игнорират. Разделителите със запетаи не са разрешени (например десетичният разделител в 123456.00).

В допълнение, знакови изрази, преобразувани в типове данни money или smallmoney, могат да съдържат незадължителен десетичен разделител и знак за долар. Разрешени са разделители под формата на запетая, например 123 456,00 рубли.

Следващият пример показва как да конвертирате данни за изход. Този пример преобразува данните за продажбите в символни данни и текущата дата в стил 3, ДД/ММ/ГГ, преди да сравни низове.

Този пример преобразува стойността на uniqueidentifier в тип данни char.

Този пример преобразува текущата дата в стил 3, ДД/ММ/ГГ.

Преобразуване на данни за дата и час

Когато преобразува към типове данни за дата и час, SQL Server отхвърля всяка стойност, която не може да бъде разпозната като дата или час. Преглед на всички типове данни и функцииЗа дати и часове в Transact-SQL вижте Функции за дата и час (Report Builder 1.0).

Следващият пример преобразува стойностите на date и datetime2 съответно в varchar и двоични типове данни.

По-долу е наборът от резултати.

Преобразуване на плаващи и реални данни

Плаващите стойности се съкращават, ако се преобразуват в който и да е целочислен тип данни.

Ако плаващ или реален тип данни трябва да се преобразува в символен тип, обикновено е по-удобно да се използва функцията за низ STR, отколкото CAST(). Това се дължи на големите възможности за форматиране на функцията STR. За повече информация вижте STR (Transact-SQL) и Функции (Transact-SQL).

Преобразуване на парични данни

При преобразуване на целочислен тип данни в тип пари се приемат парични единици. Например, целочислената стойност 4 се преобразува в стойност на тип данни пари от 4 валутни единици.

Следващият пример преобразува стойностите на smallmoney и money съответно в varchar и десетични типове данни.

По-долу е наборът от резултати.

Преобразуване на десетични и числови типове данни

За десетични и числови типове данни SQL Server третира всяка специфична комбинация от точност и мащаб като различни типове данни. Например стойностите decimal(5,5) и decimal(5,0) се считат за различни типове данни.

В операторите на Transact-SQL, константа с десетичен разделител автоматично се преобразува в стойност от числов тип данни с минималната изисквана точност и мащаб. Например константата 12 345 се преобразува в числова стойност с точност 5 и скала 3.

Преобразуването на десетичен или числов тип данни в плаващ или реален тип данни може да доведе до загуба на точност.Преобразуването на типовете данни int, smallint, tinyint, float, real, money или smallmoney в десетични или числови може да причини препълване.

По подразбиране SQL Server използва закръгляване със загуба на точност и мащаб, когато преобразува число в десетична или числова стойност. Въпреки това, когато SET ARITHABORT е ON, SQL Server извежда грешка, ако възникне препълване. Загубата на точност и мащаб не е достатъчна, за да възникне грешка.

Преобразуване на целочислени данни

Когато имплицитно преобразува целочислени данни в знакови данни, ако числото е твърде голямо за символно поле, SQL Server вмъква знак с ASCII код 42, звездичка (*).

Целочислени константи, по-големи от 2 147 483 647, се преобразуват в десетични вместо в bigint. Следващият пример демонстрира промяна на типа резултат от int на decimal, когато прагът е надвишен.

По-долу е наборът от резултати.

Преобразуване на типове данни със съхранени процедури на OLE Automation

Тъй като SQL Server използва типове данни Transact-SQL, а OLE Automation използва типове данни на Visual Basic, съхранените процедури на OLE Automation трябва да трансформират данните, които обменят.

Следващата таблица описва преобразуванията от типове данни на SQL Server към типове данни на Visual Basic.