Как посмотреть тип данных в таблице sql
Хочу сделать запрос SELECT и четко указать тип данных столбца.
Обнаружил, что это можно сделать так:
SELECT *
LalalaFloat = CAST (LalalaInt AS float)
FROM MyTable
Есть ли другие способы решить ту же самую задачу?
Лично мне кажется, что данный способ является неидеальным, т. к. здесь речь идет не об указании типа данных для всего столбца, а является приведением конкретного значения, для конкретной строки, к определенному типу данных. Т. е. наверняка есть более умные способы решения данной задачи.
Re: Типы данных полей в SELECT, как указать?
| От: | GarryIV |
| Дата: | 31.10.08 11:16 |
| Оценка: |
Здравствуйте, michag, Вы писали:
M>Лично мне кажется, что данный способ является неидеальным, т. к. здесь речь идет не об указании типа данных для всего столбца, а является приведением конкретного значения, для конкретной строки, к определенному типу данных. Т. е. наверняка есть более умные способы решения данной задачи.
Как ты себе представляешь изменение типа «столбца» не изменяя (i.e. конвертируя) каждое из значений?
WBR, Igor Evgrafov
Re[2]: Типы данных полей в SELECT, как указать?
| От: | michag |
| Дата: | 31.10.08 11:39 |
| Оценка: |
Здравствуйте, GarryIV, Вы писали:
GIV>Как ты себе представляешь изменение типа «столбца» не изменяя (i.e. конвертируя) каждое из значений?
Ну, например, когда мы проектируем таблицу, мы указываем тип данных каждого поля, и делаем это явно.
Когда мы пишем скрипт вроде «SELECT 123», мы явно тип данных столбца не указываем — тип данных, видимо, сам SQL Server выбирает.
Пусть скрипт у нас такой:
SELECT CAST(123 AS float)
UNION ALL
SELECT CAST(345.345 as int)
Какой тип данных будет у столбца? Опять же, видимо, SQL Server установит тот тип, который захочет — в данном случае он выбирает почему-то int (хотя мне это кажется нелогичным, т. к. при этом часть данных теряется — число 345.345 превращается в 345).
Можно ли экплицитно указать тип данных столбца?
Re[3]: Типы данных полей в SELECT, как указать?
| От: | daw |
| Дата: | 31.10.08 12:57 |
| Оценка: |
>Пусть скрипт у нас такой:
>
>SELECT CAST(123 AS float)
>UNION ALL
>SELECT CAST(345.345 as int)
>
>Какой тип данных будет у столбца?
если надо явно это указать, можно union делать в подзапросе, а тип приводить во внешенем запросе:
select cast(c as . ) from ( SELECT CAST(123 AS float) c UNION ALL SELECT CAST(345.345 as int) ) t
>Опять же, видимо, SQL Server установит тот тип,
>который захочет — в данном случае он выбирает почему-то int (хотя мне это кажется нелогичным,
результат будет иметь тип с наивысшим приоритетом (Precedence). таблица приоритетов есть в документации.
в данном случае это будет float. проверить можно так:
select sql_variant_property(c, 'BaseType') from ( SELECT CAST(123 AS float) c UNION ALL SELECT CAST(345.345 as int) ) t
>т. к. при этом часть данных теряется — число 345.345 превращается в 345).
так вы же сами делаете CAST(345.345 as int)
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Типы данных полей в SELECT, как указать?
| От: | michag |
| Дата: | 31.10.08 13:33 |
| Оценка: |
Здравствуйте, daw, Вы писали:
daw>результат будет иметь тип с наивысшим приоритетом (Precedence). таблица приоритетов есть в документации.
Логику понял, спасибо.
>>т. к. при этом часть данных теряется — число 345.345 превращается в 345).
daw>так вы же сами делаете CAST(345.345 as int)
Ой, это я ступил, конечно ))
Re: Типы данных полей в SELECT, как указать?
| От: | MasterZiv |
| Дата: | 31.10.08 16:06 |
| Оценка: |
michag wrote:
> SELECT *
> LalalaFloat = CAST (LalalaInt AS float)
> FROM MyTable
>
> Есть ли другие способы решить ту же самую задачу?
Да вроде бы нет.
> Лично мне кажется, что данный способ является неидеальным, т. к. здесь
> речь идет не об указании типа данных для всего столбца, а является
> приведением конкретного значения, для конкретной строки, к определенному
> типу данных.
Как бы типы данных всех полей разных записей, но одного столбца, всегда
одинаковые.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Типы данных полей в SELECT, как указать?
| От: | MasterZiv |
| Дата: | 31.10.08 16:07 |
| Оценка: |
michag wrote:
> Пусть скрипт у нас такой:
>
> SELECT CAST(123 AS float)
> UNION ALL
> SELECT CAST(345.345 as int)
>
> Какой тип данных будет у столбца?
А так нельзя писать, СУБД по идее ругаться должна.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Типы данных полей в SELECT, как указать?
| От: | Lloyd |
| Дата: | 01.11.08 12:33 |
| Оценка: |
Здравствуйте, michag, Вы писали:
M>Пусть скрипт у нас такой:
M>SELECT CAST(123 AS float)
M>UNION ALL
M>SELECT CAST(345.345 as int)
M>Какой тип данных будет у столбца? Опять же, видимо, SQL Server установит тот тип, который захочет —
Не как захочет, а выберет значение на основе типа столбцов в первом выражении в union
Как узнать тип данных в столбце sql
Приведу запрос с помощью которого можно имена полей и тип данных в таблице products:
SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = products
Типы данных в MySQL
В этой инструкции рассказываем про основные типы данных в MySQL и даем советы, где лучше использовать тот или иной тип.
Эта инструкция — часть курса «MySQL для новичков».
Смотреть весь курс
Введение
При создании таблиц в MySQL для каждого столбца нужно указывать тип данных. Он определяет, какие данные там могут храниться, как будут обрабатываться и сколько места будут занимать. В MySQL все типы данных делятся на несколько классов: числовые типы, символьные, дата/время и так далее. В каждом классе есть несколько типов данных, которые внешне могут быть похожи, но их поведение или принципы хранения отличаются. Важно выбрать правильный тип сразу при создании таблицы, потому что потом готовую структуру и приложения будет сложней переделать.
В этой статье мы расскажем об основных типах данных в MySQL и дадим советы, где лучше использовать тот или иной тип.
Возможности MySQL в «Облачных базах данных»
Числовые типы
Используются для хранения чисел. Бывают целочисленными, с плавающей точкой и с фиксированной точкой.
Целые числа
Хранят только целые числа, без дробной части. Делятся на signed (со знаком) и unsigned (без знака). Типы singed позволяют хранить как положительные, так и отрицательные значения. Типы unsigned хранят только положительные числа, но зато диапазон значений больше. Это может быть полезно в случаях, когда хранимые значения заведомо не могут быть отрицательным. Например, количество товара или идентификатор записи в таблице.
| Тип | Размер (байт) | Диапазон signed | Диапазон unsigned |
| TINYINT | 1 | -128 … 127 | 0 … 255 |
| SMALLINT | 2 | -3 2768 … 32 767 | 0 … 65 535 |
| MEDIUMINT | 3 | -8 388 608 … 8388607 | 0 … 16 777 215 |
| INT | 4 | 2 147 483 648 … 2 147 483 647 | 0 … 42 94 967 295 |
| BIGINT | 8 | -2 63 … 2 63 -1 | 0 … 2 64 -1 |
Числа с плавающей точкой
Хранят приблизительные значения. Не резервируют определенное количество бит для целочисленной или дробной частей. Поэтому у всех значений в таблице количество до и после запятой будет разным.
| Тип | Размер (байт) | Диапазон |
| FLOAT | 4 | -3.402823466E+38 … -1.175494351E-38 и 1.175494351E-38 … 3.402823466E+38 |
| DOUBLE | 8 | -1.7976931348623157E+308 … -2.2250738585072014E-308 и2.2250738585072014E-308 … 1.7976931348623157E+308 |
До версии MySQL 8.0.17 эти типы данных поддерживали диапазон unsigned, но он работал не так, как с целыми числами. Беззнаковый диапазон просто запрещал сохранять отрицательные значения, при этом максимальное значение не увеличивалось. Начиная с версии 8.0.17, использование unsigned не рекомендуется и считается устаревшим. В будущих версиях MySQL поддержку беззнакового диапазона для этого типа данных могут вовсе удалить.
Числа с фиксированной точкой
Эти типы данных используются для сохранения заданной точности. Такие числа резервируют определенное количество бит для целочисленной и дробной частей. Независимо от того, насколько большое или маленькое число, оно всегда будет использовать одно и то же количество бит для сохранения каждой части. Эти типы данных подходят для случаев, когда важна точность, например, деньги.
В MySQL для хранения чисел с фиксированной точкой используются типы DECIMAL(M,D) и NUMERIC(M,D), но по факту это синонимы. Можно использовать любой из этих типов, результат будет одинаковым. В таких столбцах максимально можно хранить до 65 чисел вместе с целочисленной и дробной частями.
Символьные (строковые)
Символьные типы используются для хранения текстов. Есть два основных типа: CHAR и VARCHAR. С точки зрения пользователя они выглядят похоже, но MySQL хранит и обрабатывает их по-разному.
- CHAR хранит строку фиксированной длины до 255 символов. Если длина вставляемой записи меньше, то MySQL автоматически дополняет значение пробелами. Например, если мы указали тип CHAR(10) и сохранили строку «Привет», то по факту в БД будет храниться строка «Привет » (обратите внимание на четыре пробела в конце строки).
Кажется, что это лишняя трата места. Но если во всех ваших записях хранятся строки примерно одной длины, то тип CHAR будет очень производительным. Например, его можно использовать для хранения хешей, у которых длина всегда одинакова.
- VARCHAR хранит строки переменной длины до 65 535 символов. Причем в памяти хранится именно та длина, которая была указана при создании. VARCHAR занимает меньше места, чем CHAR, но подвержен фрагментации и из-за этого может проигрывать в скорости обработки данных.
Текстовые и бинарные
Текстовые (TEXT) и бинарные (BLOB) типы данных используются для хранения больших объемов текста или двоичных данных. Эти типы похожи, но отличаются по способу хранения и обработки внутри MySQL.
- BLOB обрабатывается как двоичные данные. В нем не хранится набор символов, а операции сортировки и сравнения основаны на числовых значениях байтов.
- TEXT обрабатывается как символьные строки. В нем хранится именно набор символов, а значения сортируются и сравниваются на основе сопоставления набора символов..
Текстовые типы отлично подходят для хранения больших текстов: статей, докладов и так далее. А бинарные типы могут хранить любые файлы или мультимедиа-контент.
| Тип | Размер (байт) | Макс. размер символов |
| TINYTEXT / TINYBLOB | 255 | 255 |
| TEXT / BLOB | 65 535 | 65 535 |
| MEDIUMTEXT / MEDIUMBLOB | 16 777 215 | 2 24 -1 |
| LONGTEXT / LONGBLOB | 4 294 967 295 | 2 32 -1 |
Кажется, что типы TINYTEXT и TEXT похожи на CHAR и VARCHAR. Но разница в том, что MySQL не умеет индексировать текстовые и бинарные типы и не может использовать индексы для сортировки.
Дата/время
Типы данных, которые позволяют работать с датой и временем.
| Тип | Размер (байт) | Описание |
| DATE | 3 | Только дата в формате YYYY-MM-DD. Допустимые значения от 1000-01-01 до 9999-12-31 |
| DATETIME | 8 | Дата и время в формате YYYY-MM-DD HH:MM:SS. Допустимые значения от 1000-01-01 00:00:00 до 9999-12-31 23:59:59 |
| TIMESTAMP | 4 | Дата и время. Хранится в виде количества секунд, прошедших с 1 января 1970 года по гринвичу. Занимает в два раза меньше места, чем тип DATETIME. Но при этом диапазон ограничен значениями от 1970-01-01 00:00:01 до 2038-01-09 03:14:07 |
| TIME | 3 | Только время в формате HH:MM:SS. Допустимые значения от 00:00:00 до 23:59:59 |
| YEAR(N) | 1 | Только год в формате YYYY или YY. Допустимые значения от 1901 до 2155 или от 70 до 69 (1970 — 2069) |
JSON
Это относительно новый тип данных, который появился в MySQL версии 5.7.8. Он позволяет нативно хранить и обрабатывать данные в JSON-формате.
В отличие от хранения объектов в виде текста, в использовании специального типа данных есть несколько преимуществ:
- Валидация JSON-объектов. Если попытаться сохранить неправильный JSON, MySQL сгенерирует ошибку.
- Возможность нативно работать с JSON, выбирать и обновлять только отдельные части объектов, а не весь объект целиком.
- MySQL сохраняет тип JSON в специальном внутреннем формате. Такой способ более производительный, чем работа с JSON в виде строки.
Составные типы
Строковые типы данных, которые могут хранить значения только из заранее определенного списка. Несмотря на то, что список значений состоит из строк, в самих таблицах хранятся только числа, которые ассоциированы со справочником возможных значений. Поэтому они занимают мало места.
- ENUM может хранить только одно значение из списка, занимает 1-2 байта.
- SET может хранить одновременно до 64 значений из списка, занимает от 1 до 8 байт.
Заключение
Мы рассмотрели основные типы данных и полей в MySQL, объяснили разницу между схожими типами. Теперь вы можете создавать свои структуры БД, используя полученные знания.
Создание базы данных в MySQL
DESCRIBE TABLE
Запрос DESCRIBE для каждого столбца таблицы возвращает строку со следующими значениями типа String:
- name — имя столбца;
- type — тип столбца;
- default_type — вид выражения для значения по умолчанию: DEFAULT , MATERIALIZED или ALIAS . Если значение по умолчанию не задано, то возвращается пустая строка;
- default_expression — значение, заданное в секции DEFAULT ;
- comment — комментарий;
- codec_expression — кодек, который применяется к столбцу;
- ttl_expression — выражение TTL;
- is_subcolumn — флаг, который равен 1 для внутренних подстолбцов. Он появляется в результате, только если описание подстолбцов разрешено настройкой describe_include_subcolumns.
Каждый столбец Nested структур описывается отдельно. Перед его именем ставится имя родительского столбца с точкой. Чтобы отобразить внутренние подстолбцы других типов данных, нужно включить настройку describe_include_subcolumns.
Пример
CREATE TABLE describe_example ( id UInt64, text String DEFAULT 'unknown' CODEC(ZSTD), user Tuple (name String, age UInt8) ) ENGINE = MergeTree() ORDER BY id; DESCRIBE TABLE describe_example; DESCRIBE TABLE describe_example SETTINGS describe_include_subcolumns=1;
┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ id │ UInt64 │ │ │ │ │ │ │ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │ │ user │ Tuple(name String, age UInt8) │ │ │ │ │ │ └──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
Второй запрос дополнительно выводит информацию о подстолбцах:
┌─name──────┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┬─is_subcolumn─┐ │ id │ UInt64 │ │ │ │ │ │ 0 │ │ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │ 0 │ │ user │ Tuple(name String, age UInt8) │ │ │ │ │ │ 0 │ │ user.name │ String │ │ │ │ │ │ 1 │ │ user.age │ UInt8 │ │ │ │ │ │ 1 │ └───────────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┴──────────────┘
См. также
- настройка describe_include_subcolumns.