loading..
Русский    English
13:56
листать

CHAR и VARCHAR стр. 1

Недавно мне довелось искать ошибку в решении, которое содержало такое преобразование:

  1. CAST(model AS VARCHAR)

Те, кто изучил схему «Компьютеры», подумают о бессмысленности преобразования типа в тот же самый тип (столбец model определен как VARCHAR(50)). Однако именно это преобразование и делало запрос неверным.

Дело в том, что, если размер типа при преобразовании не указан, то в  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server принимается значение по умолчанию, которое для VARCHAR равно 30. При этом если преобразуемая строка имеет больший размер, то отсекаются все символы кроме первых 30-ти. Разумеется, никакой ошибки при этом не возникает. Как раз на «длинных» номерах моделей предложенное решение и давало неверный результат. Как говорится в таких случаях, читайте документацию. Однако интересно, что по этому поводу говорит Стандарт?

Согласно стандарту, если для типов CHAR и VARCHAR размер не указан, то подразумевается CHAR(1) и VARCHAR(1) соответственно. Давайте проверим, как следуют стандарту доступные мне СУБД: SQL Server, MySQL, PostgreSQL.

Тут имеется два аспекта:

1. Преобразование типа

2. Использование типов CHAR/VARCHAR при описании схемы (DDL).

Начнем с преобразования типа.

SQL Server 2008

Консоль
Выполнить
  1. SELECT CAST('11111111112222222222333333333344444444445555555555' AS CHAR) chr,
  2. CAST('11111111112222222222333333333344444444445555555555' AS VARCHAR) vchr;

В результате получим

chr vchr
111111111122222222223333333333 111111111122222222223333333333

То есть оба символьных типа усекаются до значения по умолчанию, которое равно 30. Никаких сообщений об ошибках не возникает, что, собственно, соответствует стандарту.

PostgreSQL 8.3

  1. SELECT CAST('11111111112222222222333333333344444444445555555555' AS CHAR) AS chr,
  2. CAST('11111111112222222222333333333344444444445555555555' AS VARCHAR) AS vchr;

chr vchr
1 11111111112222222222333333333344444444445555555555

Налицо половинчатое следование стандарту, т.е. соответствие ему в отношении типа CHAR. Что касается типа VARCHAR, то согласно документации, если длина строки не указана, принимается строка любого размера, т.е. усечения не происходит. (If character varying is used without length specifier, the type accepts strings of any size.)

MySQL 5.0

Как говорится, чем дальше, тем «страньше». Оказывается, в MySQL преобразование к типу VARCHAR вообще не поддерживается. Нам остается проверить только преобразование к CHAR:

  1. SELECT CAST('11111111112222222222333333333344444444445555555555' AS CHAR) chr;

chr
11111111112222222222333333333344444444445555555555

Т.е. строка не усекается; при этом в документации читаю: «Если при использовании функций CAST и CONVERT размер не указан, то длина по умолчанию – 30.» (When n is not specified when using the CAST and CONVERT functions, the default length is 30).

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100