Varbinary тип данных: binary и varbinary (Transact-SQL) — SQL Server

Строковые и двоичные типы — SQL Server





Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья

  • Чтение занимает 2 мин

Применимо к:база данныхSQL Server Azure SQL Управляемый экземпляр SQL Azure

SQL Server поддерживает следующие двоичные и строковые типы.

ТипОписание
binary и varbinaryТипы двоичных данных фиксированной или переменной длины. Если для обмена данными лучше всего подходит тип binary, то другие типы данных удобнее всего будет преобразовать в binary и varbinary.
char и varcharСимвольные типы данных имеют фиксированный (char) или переменный (varchar) размер.

Начиная с SQL Server 2019 (15.x) при использовании параметров сортировки с поддержкой UTF-8 эти типы данных хранят весь диапазон символьных данных Юникод и используют кодировку UTF-8.

nchar и nvarcharСимвольные типы данных Юникода, которые имеют фиксированный размер, nchar или переменный размер, nvarchar.

Начиная с SQL Server 2012 (11.x) при использовании параметров сортировки с поддержкой дополнительных символов эти типы данных хранят весь диапазон символьных данных Юникод и используют кодировку UTF-16.

ntext, text, и imageЭти типы данных фиксированной и переменной длины предназначены для хранения символьных и двоичных данных в формате Юникод и иных форматах. Данные Юникода используют набор символов Юникода UCS-2.

Типы данных ntext, textи image будут исключены из следующей версии SQL Server. Следует избегать использования этих типов данных при новой разработке и запланировать изменение приложений, использующих их в настоящий момент.

  • Типы данных (Transact-SQL)
  • Числовые типы
  • Строковые функции






MS SQL Server и T-SQL

Последнее обновление: 12.07.2017

При создании таблицы для всех ее столбцов необходимо указать определенный тип данных. Тип данных определяет, какие значения могут храниться в столбце,
сколько они будут занимать места в памяти.

Язык T-SQL предоставляет множество различных типов. В зависимости от характера значений все их можно разделить на группы.

Числовые типы данных
  • BIT: хранит значение от 0 до 16. Может выступать аналогом булевого типа в языках программирования (в этом случае значению true соответствует 1, а
    значению false — 0). При значениях до 8 (включительно) занимает 1 байт, при значениях от 9 до 16 — 2 байта.

  • TINYINT: хранит числа от 0 до 255. Занимает 1 байт. Хорошо подходит для хранения небольших чисел.

  • SMALLINT: хранит числа от –32 768 до 32 767. Занимает 2 байта

  • INT: хранит числа от –2 147 483 648 до 2 147 483 647. Занимает 4 байта. Наиболее используемый тип для хранения чисел.

  • BIGINT: хранит очень большие числа от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, которые
    занимают в памяти 8 байт.

  • DECIMAL: хранит числа c фиксированной точностью.
    Занимает от 5 до 17 байт в зависимости от количества чисел после запятой.

    Данный тип может принимать два параметра precision и scale: DECIMAL(precision, scale).

    Параметр precision представляет максимальное количество цифр, которые может хранить число.
    Это значение должно находиться в диапазоне от 1 до 38. По умолчанию оно равно 18.

    Параметр scale представляет максимальное количество цифр, которые может содержать число после запятой.
    Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.

  • NUMERIC: данный тип аналогичен типу DECIMAL.

  • SMALLMONEY: хранит дробные значения от -214 748.3648 до 214 748.3647. Предназначено для хранения денежных величин.
    Занимает 4 байта. Эквивалентен типу DECIMAL(10,4).

  • MONEY: хранит дробные значения от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. Представляет денежные величины
    и занимает 8 байт. Эквивалентен типу DECIMAL(19,4).

  • FLOAT: хранит числа от –1.79E+308 до 1.79E+308.
    Занимает от 4 до 8 байт в зависимости от дробной части.

    Может иметь форму опредеения в виде FLOAT(n), где n представляет число бит, которые используются для хранения десятичной части числа (мантиссы).
    По умолчанию n = 53.

  • REAL: хранит числа от –340E+38 to 3.40E+38. Занимает 4 байта. Эквивалентен типу FLOAT(24).

Примеры числовых столбцов:


Salary MONEY,
TotalWeight DECIMAL(9,2),
Age INT,
Surplus FLOAT
Типы данных, представляющие дату и время
  • DATE: хранит даты от 0001-01-01 (1 января 0001 года) до 9999-12-31 (31 декабря 9999 года). Занимает 3 байта.

  • TIME: хранит время в диапазоне от 00:00:00.0000000 до 23:59:59.9999999. Занимает от 3 до 5 байт.

    Может иметь форму TIME(n), где n представляет количество цифр от 0 до 7 в дробной части секунд.

  • DATETIME: хранит даты и время от 01/01/1753 до 31/12/9999. Занимает 8 байт.

  • DATETIME2: хранит даты и время в диапазоне от 01/01/0001 00:00:00.0000000 до 31/12/9999 23:59:59.9999999. Занимает от 6 до 8 байт в
    зависимости от точности времени.

    Может иметь форму DATETIME2(n), где n представляет количество цифр от 0 до 7 в дробной части секунд.

  • SMALLDATETIME: хранит даты и время в диапазоне от 01/01/1900 до 06/06/2079, то есть ближайшие даты.
    Занимает от 4 байта.

  • DATETIMEOFFSET: хранит даты и время в диапазоне от 0001-01-01 до 9999-12-31. Сохраняет детальную
    информацию о времени с точностью до 100 наносекунд. Занимает 10 байт.

Распространенные форматы дат:

  • yyyy-mm-dd2017-07-12

  • dd/mm/yyyy12/07/2017

  • mm-dd-yy07-12-17

    В таком формате двузначные числа от 00 до 49 воспринимаются как даты в диапазоне 2000-2049. А числа от 50 до 99 как диапазон чисел 1950 — 1999.

  • Month dd, yyyyJuly 12, 2017

Распространенные форматы времени:

  • hh:mi13:21

  • hh:mi am/pm1:21 pm

  • hh:mi:ss1:21:34

  • hh:mi:ss:mmm1:21:34:12

  • hh:mi:ss:nnnnnnn1:21:34:1234567

Строковые типы данных
  • CHAR: хранит строку длиной от 1 до 8 000 символов. На каждый символ выделяет по 1 байту.
    Не подходит для многих языков, так как хранит символы не в кодировке Unicode.

    Количество символов, которое может хранить столбец, передается в скобках. Например, для столбца с типом CHAR(10) будет выделено 10 байт. И если мы сохраним в столбце строку менее 10 символов, то она будет дополнена пробелами.

  • VARCHAR: хранит строку. На каждый символ выделяется 1 байт. Можно указать конкретную длину для столбца —
    от 1 до 8 000 символов, например, VARCHAR(10).
    Если строка должна иметь больше 8000 символов, то задается размер MAX, а на хранение строки может выделяться до
    2 Гб: VARCHAR(MAX).

    Не подходит для многих языков, так как хранит символы не в кодировке Unicode.

    В отличие от типа CHAR если в столбец с типом VARCHAR(10) будет сохранена строка в 5 символов, то в столце будет сохранено именно пять символов.

  • NCHAR: хранит строку в кодировке Unicode длиной от 1 до 4 000 символов. На каждый символ выделяется 2 байта. Например, NCHAR(15)

  • NVARCHAR: хранит строку в кодировке Unicode. На каждый символ выделяется 2 байта.Можно задать конкретный размер от 1 до 4 000 символов: .
    Если строка должна иметь больше 4000 символов, то задается размер MAX, а на хранение строки может выделяться до
    2 Гб. 31–1 байт при использовании
    значения MAX (VARBINARY(MAX)).

Еще один бинарный тип — тип IMAGE является устаревшим, и вместо него рекомендуется применять тип VARBINARY.

Остальные типы данных
  • UNIQUEIDENTIFIER: уникальный идентификатор GUID (по сути строка с уникальным значением), который занимает 16 байт.

  • TIMESTAMP: некоторое число, которое хранит номер версии строки в таблице.
    Занимает 8 байт.

  • CURSOR: представляет набор строк.

  • HIERARCHYID: представляет позицию в иерархии.

  • SQL_VARIANT: может хранить данные любого другого типа данных T-SQL.

  • XML: хранит документы XML или фрагменты документов XML. Занимает в памяти до 2 Гб.

  • TABLE: представляет определение таблицы.

  • GEOGRAPHY: хранит географические данные, такие как широта и долгота.

  • GEOMETRY: хранит координаты местонахождения на плоскости.

НазадСодержаниеВперед

SQL Server IMAGE и VARBINARY Типы данных

Автор: James Miller

7 мая 2021 г. Недавно Microsoft начала предлагать использовать VARBINARY(MAX) вместо IMAGE для хранения большого объема данных в одном столбце, поскольку IMAGE будет упразднен в будущей версии MS SQL Server.

Иллюстрация

Как всегда, я думаю, что лучший способ понять что-либо — это рассмотреть рабочий пример. Здесь давайте представим базу данных сотрудников, в которой вместе с идентификационной информацией содержится уникальный образ человека. Я хотел бы импортировать изображения для каждого сотрудника из исходного местоположения в таблицу, а затем иметь возможность экспортировать изображение для последующей обработки.

Azure Data Studio

В этом упражнении я решил использовать Azure Data Studio и локальную базу данных SQL Server, но вы также можете легко использовать SQL Server Management Studio (SSMS).

Не знаете, какой инструмент использовать? Сравните инструменты здесь.

В этом упражнении я предполагаю, что у вас есть базовые знания об использовании Azure Data Studio (вход и подключение к базе данных, выполнение запросов и т. д.), но если нет, воспользуйтесь полезным кратким руководством.

Настройка

Есть предварительный шаг, который я должен сделать, чтобы этот пример заработал. То есть параметр OLE Automation Procedures должен быть «установлен и активен» на экземпляре SQL Server, который будет использоваться для действия по экспорту изображения, которое я буду использовать, а роль сервера bulkadmin (которая предоставляет массовое копирование и другие массовые операции) должна будет предоставлен пользователю, который будет импортировать и экспортировать изображения.

Параметр процедур автоматизации Ole SQL Server определяет, могут ли объекты OLE-автоматизации создаваться в пакетах Transact-SQL. Это расширенные хранимые процедуры, которые позволяют пользователям SQL Server выполнять функции, внешние по отношению к SQL Server, в контексте безопасности SQL Server.

Вот сценарий T-SQL, который предоставляет эти привилегии (я назначаю себе роль bulkadmin):

Создание таблицы

таблица, в которой будут храниться изображения. Таблица будет иметь «типичный» идентификатор сотрудника (определяемый как IDENTITY) и имя (NVARCHAR), но также будет включать два дополнительных столбца, которые будут содержать имя файла физического образа, хранящегося как тип данных NVARCHAR, а также двоичные данные этого файла изображения , хранящиеся как тип данных VARBINARY (ранее вы могли использовать тип данных IMAGE).

Ниже приведен простой сценарий T-SQL, который я использовал для создания таблицы:

Сортировка изображений

В моем небольшом примере я предполагаю, что у меня есть список имен сотрудников, каждый из которых предоставил « селфи», сохраненный в формате jpg:

Я сохранил файлы изображений в следующей локальной папке:

Что я хочу сделать, так это сохранить фактическое предоставленное изображение в таблице базы данных в виде двоичных данных (а не ссылки на расположение файла) вместе с именем сотрудника.

Импорт изображений

Так как я собираюсь загружать изображения по мере найма новых сотрудников, я могу использовать удобную хранимую процедуру, как показано ниже. Процедура (в общих чертах основанная на концепции, предложенной онлайн на сайте msqltips.com) вставляет запись в нашу таблицу EmployeeDetails, преобразуя и сохраняя файл физического изображения в виде двоичных данных с помощью SQL-функции OPENROWSET:0005

Создав хранимую процедуру, я могу выполнить следующие операторы запроса T-SQL (по одному для каждого из наших сотрудников):

table (используя следующую команду T-SQL select), я увижу, что наша таблица EmployeeDetails была загружена с идентификатором каждого сотрудника, именем, именем файла изображения или изображения (селфи), а также изображение было преобразовано и сохранено:

выберите * из EmployeeDetails

 

Экспорт изображений

Теперь, когда данные успешно сохранены, нет необходимости хранить исходные физические файлы изображений, поскольку они сохранены в таблице базы данных в виде двоичных данных. . Чтобы использовать эти данные позже, мне нужна вторая хранимая процедура, которая может «преобразовывать» двоичные данные обратно в физическое изображение «на лету», чтобы его можно было просмотреть.

Ниже приведена хранимая процедура, использующая для этого объект ADO Stream. Объект ADO Stream используется для чтения, записи и управления потоком двоичных данных или текста.

Эта хранимая процедура будет считывать двоичные данные из таблицы, преобразовывать их обратно в файл .jpg и затем сохранять в нужную папку. Вы можете запустить процедуру с помощью следующей команды T-SQL:

exec dbo.usp_ExportEmployeeImage ‘Brad Pitt’,’C:\MyPictures\Output’,’BP.jpg’

Viewer

Теперь, когда я видели, как преобразовывать изображения в двоичные данные, сохранять их и извлекать из таблицы SQL Server, используя T-SQL, было бы неплохо иметь возможность просматривать изображения с помощью простого табличного запроса, однако это невозможно. Помните, что данные (изображения), хранящиеся в столбцах VARBINARY, хранятся в двоичном формате, поэтому при выборе данных в AZURE или SSMS они не преобразуются, а отображаются с использованием шестнадцатеричного представления двоичных данных (как показано ранее).

Доступны сторонние средства просмотра изображений, такие как средство просмотра изображений SQL от YOHZ Software, которое можно загрузить и попробовать бесплатно. После его установки (сложной настройки не требуется) вы можете подключиться к своей базе данных SQL и выполнить простой запрос:

 

Хотя приведенный выше вариант довольно удобен, я всегда предпочитаю изучать создание собственного решения.

Простая альтернатива

В качестве простой альтернативы я буду использовать код Python с открытым исходным кодом для создания собственного «средства просмотра изображений». Я часто использовал pyodbc в прошлом, поэтому я могу снова использовать его здесь для подключения к базе данных SQL и, после подключения, для выполнения запросов, а также выполнения хранимых процедур, созданных ранее. Ниже мой код:

Для подключения используйте эту функцию:

Если я запускаю сценарий, он создает файл «employee_list.html», показанный ниже (открытый в веб-браузере):

Заключение

03 Упражнение исследовало множество тем, таких как переход от типа данных IMAGE к типу данных VARBINARY и способы преобразования, хранения и извлечения изображений с помощью объектов OLE Automation – все это путем выполнения операторов T-SQL в Azure Data Studio. Наконец, я использовал некоторый код Python для создания простой HTML-страницы для просмотра данных.

sql server 2008 — Есть ли большая техническая разница между типами данных VARBINARY (MAX) и IMAGE?

спросил

Изменено
7 лет, 9 месяцев назад

Просмотрено
21к раз

Я читал в Интернете эти заявления о SQL Server 931-1
(2 147 483 647) байт.

Есть ли действительно большая техническая разница между типами данных VARBINARY(MAX) и IMAGE ?

Если есть разница: нужно ли настраивать, как ADO.NET вставляет и обновляет поле данных изображения в SQL Server?

  • image
  • sql-server-2008
  • ado.net
  • varbinary

Они хранят одни и те же данные: на этом все.

» image » устарело и имеет ограниченный набор функций и операций, которые с ним работают. varbinary(max) можно использовать как более короткий varbinary (то же самое для text и varchar(max) ).

Не используйте изображение для любого нового проекта: просто найдите здесь проблемы, которые возникают у людей с типами данных изображение и текст из-за ограниченной функциональности.

Примеры из SO: One, Two

1

Я думаю, что технически они похожи, но важно отметить следующее из документации:

Типы данных ntext, text и image будут удалены в будущей версии MicrosoftSQL Server. Избегайте использования этих типов данных в новых разработках и планируйте модифицировать приложения, которые в настоящее время их используют. Вместо этого используйте nvarchar(max), varchar(max) и varbinary(max).

Типы данных фиксированной и переменной длины для хранения больших символов, отличных от Unicode и Unicode, и двоичных данных. Данные Unicode используют набор символов UNICODE UCS-2.

Они хранят одни и те же данные: на этом все.

«образ» устарел и имеет ограниченный набор функций и операций.
что с ним работают. varbinary(max) может работать как более короткий
varbinary (то же самое для текста и varchar(max)).

Не используйте изображение для любого нового проекта: просто ищите проблемы здесь
люди имеют с изображениями и текстовыми типами данных из-за ограниченного
функциональность.

На самом деле VARBINARY может хранить любые данные, которые можно преобразовать в байтовый массив, например файлы, и это тот же процесс, что и IMAGE использует тип данных, поэтому, с этой точки зрения, оба типа данных могут хранить одни и те же данные.
Но VARBINARY имеют свойство размера, а IMAGE принимает любой размер до ограничений типа данных, поэтому при использовании типа данных IMAGE вы потратите больше ресурсов для хранения тех же данных.
В Microsoft® SQL Server® тип данных IMAGE действительно устарел, поэтому вы должны сделать ставку на тип данных VARBINARY .

Но будьте осторожны: Microsoft® SQL Server® CE® (включая последнюю версию 4.0) по-прежнему использует тип данных IMAGE , и, вероятно, этот тип данных не «исчезнет» так скоро, потому что в версиях Compact Edition этот тип данных лучше любого другое для быстрого хранения файлов.

Я случайно нашел между ними одно различие. Вы можете вставить строку в тип изображения, но не в varbinary. Возможно, именно поэтому MS не рекомендует использовать тип изображения, поскольку на самом деле не имеет смысла устанавливать изображение со строкой.