Тип данных text sql: Типы данных SQL, MySQL, Oracle, Access, Microsoft SQL Server, PostgreSQL, DB2

Обходим ошибку The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator

Инструкция по устранению ошибки при работе с SQL запросом — «The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator», если в запросе присутствует сортировка (ORDER BY) или группировка (GROUP BY):

Пример сообщения об ошибке:

Server: Msg 306, Level 16, State 1, Line 1
The text, ntext, and image data types cannot be compared
or sorted, except when using IS NULL or LIKE operator.

Тип данных NTEXT используется для данных в кодировке Unicode произвольной длины, тип данных TEXT используется для данных в остальных кодировках произвольной длины, тип данных IMAGE используется для бинарных данных произвольной длины.

Один из путей получить эту ошибку — это включить колонку типа TEXT, NTEXT или IMAGE в сортировку (ORDER BY). Для иллюстрации приведу скрипт, генерирующий эту ошибку:

CREATE TABLE [dbo]. [Article] (
    [ArticleID]     INT NOT NULL IDENTITY(1, 1),
    [ArticleName]          NVARCHAR(200),
    [Author]            NVARCHAR(100),
    [Summary]           NTEXT
)

SELECT * FROM [dbo].[Article]
ORDER BY [Summary]

В итоге получим эту ошибку:

Msg 306, Level 16, State 2, Line 2
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Другой путь получения этой ошибки — включить колонку типа TEXT, NTEXT или IMAGE в группировку (GROUP BY), например как в этом скрипте:

SELECT [Summary], COUNT(*)
FROM [dbo].[Article]
GROUP BY [Summary]

Т.к. в новых версиях SQL Server типы данных ntext, text и image будут удалены, то следует избегать их использования. При использовании SQL Server версии 2005 или новее используйте типы nvarchar(max), varchar(max) и varbinary(max) соответственно.

Пути обхода

Если изменить типы в таблице нет возможности, а использовать подобные запросы необходимо, то можно воспользоваться следующим решением — преобразовать колонки типа TEXT или NEXT в тип VARCHAR или NVARCHAR непосредственно в SELECT-запросах при использовании сортировки (ORDER BY) и/или группировки (GROUP BY).

Примеры:

1) При использовании SQL Server 2000 колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(4000) в условии сортировки (ORDER BY) для избежания ошибки и генерации желаемого результата:

SELECT * FROM [dbo].[Article]
ORDER BY CAST([Summary] AS NVARCHAR(4000))

При использовании SQL Server 2005 или SQL Server 2008 (или новее), вместо NVARCHAR(4000), колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(MAX):

SELECT * FROM [dbo].[Article]
ORDER BY CAST([Summary] AS NVARCHAR(MAX))

2) Если необходимо сделать группировку подобных поле, поступаем также, как в примере 1.

Для SQL Server 2000:

SELECT CAST([Summary] AS NVARCHAR(4000)) AS [Summary], COUNT(*)
FROM [dbo].[Article]
GROUP BY CAST([Summary] AS NVARCHAR(4000))

Для SQL Server 2005 или SQL Server 2008 (или новее):

SELECT CAST([Summary] AS NVARCHAR(MAX)) AS [Summary], COUNT(*)
FROM [dbo]. [Article]
GROUP BY CAST([Summary] AS NVARCHAR(MAX))

Во избежании подобной ошибки рекомендуется преобразовать все имеющиеся таблицы с подобными типами данных в типы VARCHAR(MAX), NVARCHAR(MAX) и VARBINARY(MAX) соответственно.

© Элла С. (Автор: Ella Sea)

SQL — типы данных — CoderLessons.com

Тип данных SQL – это атрибут, который определяет тип данных любого объекта. Каждый столбец, переменная и выражение имеют связанный тип данных в SQL. Вы можете использовать эти типы данных при создании таблиц. Вы можете выбрать тип данных для столбца таблицы на основе ваших требований.

SQL Server предлагает шесть категорий типов данных для вашего использования, которые перечислены ниже –

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

ТИП ДАННЫХ ОТ К
BIGINT -9.223.372.036.854.775.808 9.223.372.036.854.775.807
ИНТ -2147483648 2147483647
SMALLINT -32768 32767
TINYINT 0 255
немного 0 1
десятичный -10 ^ 38 +1 10 ^ 38 -1
числовой -10 ^ 38 +1 10 ^ 38 -1
Деньги -922,337,203,685,477. 5808 +922,337,203,685,477.5807
smallmoney -214,748.3648 +214,748.3647

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

ТИП ДАННЫХ ОТ К
поплавок -1,79E + 308 1,79E + 308
реальный -3.40E + 38 3.40E + 38

Типы данных даты и времени

ТИП ДАННЫХ ОТ К
Дата и время 1 января 1753 г. 31 декабря 9999 г.
smalldatetime 1 января 1900 г. 6 июня 2079 г.
Дата Хранит дату как 30 июня 1991
время Хранит время суток, как 12:30 вечера

Примечание. Здесь datetime имеет точность 3,33 миллисекунды, тогда как smalldatetime имеет точность 1 минуту.

голец

Максимальная длина 8000 символов. (Фиксированная длина символов, отличных от Unicode)

VARCHAR

Максимум 8000 символов. (Данные не переменной Юникода).

VARCHAR (макс)

Максимальная длина 2E + 31 символ, переменная длина не в Юникоде (только для SQL Server 2005).

текст

Данные переменной длины, отличные от Unicode, с максимальной длиной 2 147 483 647 символов.

NCHAR

Максимальная длина 4000 символов. (Фиксированная длина Unicode)

NVARCHAR

Максимальная длина 4000 символов. (Переменная длина Unicode)

NVARCHAR (макс)

Максимальная длина 2E + 31 символов (только для SQL Server 2005). (Unicode с переменной длиной)

NTEXT

Максимальная длина 1 073 741 823 символа. (Переменная длина Unicode)

двоичный

Максимальная длина 8000 байт (двоичные данные фиксированной длины)

VARBINARY

Максимальная длина 8000 байт. (Двоичные данные переменной длины)

VARBINARY (макс)

Максимальная длина 2E + 31 байт (только для SQL Server 2005). (Двоичные данные переменной длины)

образ

Максимальная длина 2 147 483 647 байт. (Двоичные данные переменной длины)

sql_variant

Хранит значения различных типов данных, поддерживаемых SQL Server, кроме text, ntext и timestamp.

отметка времени

Хранит уникальный для всей базы данных номер, который обновляется каждый раз при обновлении строки

уникальный идентификатор

Хранит глобальный уникальный идентификатор (GUID)

XML

Хранит данные XML. Вы можете хранить экземпляры XML в столбце или переменной (только для SQL Server 2005).

курсор

Ссылка на объект курсора

Таблица

Сохраняет набор результатов для последующей обработки

sql server 2008 — лучший тип данных для таблицы SQL с большим количеством длинных текстовых полей

спросил

Изменено
13 лет, 4 месяца назад

Просмотрено
20 тысяч раз

У меня есть следующая таблица в базе данных SQL Server 2008 с большим количеством длинных полей varchar для текстовых описаний. Я хочу знать, какой тип данных лучше всего использовать для них. В настоящее время я использую varchar с ограничением на 2000 символов, но это может вызвать проблемы, если людям нужно добавить больше текста. Есть ли проблема с использованием TEXT более одного раза в таблице? Что ты посоветуешь?

 Таблица
 имя varchar(250)
 описание1 varchar(2000)
 описание2 varchar(2000)
 описание3 varchar(2000)
 описание4 varchar(2000)
 описание5 varchar(2000)
 
  • sql-server-2008
  • types

Я считаю, что для SQL Server 2008 рекомендуется использовать varchar(max), а не текст — я считаю, что текст устарел в будущей версии SQL Server .

Дизайн вашей таблицы кажется мне достаточно разумным, но я подозреваю, что некоторые предположат, что если столбцы заполнены до максимума, а количество строк в таблице велико, то могут возникнуть некоторые проблемы с производительностью. SQL Server может хранить только 8 КБ на страницу базы данных, поэтому ему придется разделить нашу таблицу, что влияет на производительность.

1

Еще одним преимуществом использования varchar(MAX) является то, что поля не будут учитываться при максимальном размере строки 8 КБ, поскольку каждое из этих полей может быть больше 8 КБ само по себе, SQL сохранит их за пределами страницы данных, как только необходимо, поэтому все, что хранится на странице, — это указатель на данные.

На мой взгляд, есть проблема с использованием TEXT — это устарело!

Вместо VARCHAR(2000) , просто используйте VARCHAR(MAX) — это дает вам весь размер столбца TEXT, и вы сможете манипулировать им, просто лежащим столбцом VARCHAR(...) .

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

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

Предложение WHERE в SQL Server «Текстовый» тип данных

спросил

Изменено
4 года, 11 месяцев назад

Просмотрено
234 тысячи раз

Где [CastleType] установлен как тип данных «текст» в SQL Server и запрос:

 ВЫБОР *
ИЗ [Деревня]
ГДЕ [CastleType] = 'foo'
 

Я получаю сообщение об ошибке:

Типы данных TEXT и VARCHAR несовместимы в операторе равенства.

Можно ли не запрашивать этот тип данных с предложением WHERE?

  • sql-сервер
  • sql-сервер-2005
  • tsql

2

Вы можете использовать LIKE вместо = . Без каких-либо подстановочных знаков это будет иметь тот же эффект.

 ОБЪЯВИТЬ @Village TABLE
        (Текст CastleType)
ВСТАВЬТЕ В @Village
ЦЕННОСТИ
  (
    'фу'
  )
ВЫБИРАТЬ *
ОТ @Village
ГДЕ [CastleType] НРАВИТСЯ 'foo'
 

текст устарел. Изменение на varchar(max) будет проще в работе.

Насколько велики могут быть данные? Если вы собираетесь проводить сравнения на равенство, в идеале вам нужно проиндексировать этот столбец. Это невозможно, если вы объявляете столбец шире 9.00 байт, хотя вы можете добавить вычисляемый столбец контрольной суммы или хэш , который можно использовать для ускорения этого типа запроса.

Пожалуйста, попробуйте это

 ВЫБЕРИТЕ *
ИЗ [Деревня]
ГДЕ ПРЕОБРАЗОВАТЬ (VARCHAR, CastleType) = 'foo'
 

2

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

Если вы не можете изменить тип данных в самой таблице, чтобы использовать varchar(max), измените свой запрос на это:

 SELECT *
ИЗ [Деревня]
ГДЕ ПРЕОБРАЗОВАТЬ (VARCHAR (MAX), [CastleType]) = 'foo'
 

Это не то, о чем говорится в сообщении об ошибке. Там написано, что нельзя использовать оператор =. Попробуйте, например, LIKE 'foo' .

2

Другой вариант:

 SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
 

3

Это работает в MSSQL и MySQL:

 SELECT *
ИЗ Деревня
ГДЕ CastleType LIKE '%foo%';
 

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

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