# Именование объектов

В Picodata, благодаря ее реляционной природе, существует большое
количество разнообразных объектов:

- таблицы
- индексы
- колонки
- роли
- пользователи
- процедуры
- и т.д.

Для всех них в SQL-командах выполняются общие правила и ограничения.

## Ограничения имен {: #restriction }

Имена объектов (таблиц, колонок, ролей, пользователей и т.д.) могут
содержать русские и английские буквы во всех регистрах, цифры (но не в
начале имени), а также символы дефиса (`-`, U+2010) и нижнего
подчеркивания (`_`, U+005F). Максимальная длина имени объекта ограничена
65000 байтов (не символов). Допускается использование пробелов (в таком
случае имя объекта должно быть заключено в одинарные кавычки).

!!! tip "Совет"
    Использование псевдонимов и имен колонок не длиннее **23 байтов**
    существенно повысит производительность планирования распределенного запроса.

## Чувствительность к регистру {: #sensitivity }

Если сами команды SQL нечувствительны к регистру (`select` равнозначен
`SELECT`), то регистр имен объектов имеет значение при условии, что
имена заключены в двойные кавычки. То есть, команды `create table
"warehouse"...` и `create table "Warehouse"...` создадут две разные
таблицы.

При разборе SQL содержимое двойных кавычек будет прочитано "как
написано". Как следствие, внутри двойных кавычек можно использовать
пробелы. В случае наименования без кавычек, имя объекта будет явно
приведено в нижний регистр. Например, команды `create table
WAREHOUSE...` и `create table "warehouse"...` создадут одну и ту же
таблицу `warehouse`.

## Поддержка схемы public {: #public_schema_support }

Для совместимости со сторонними СУБД, в первую очередь, с PostgreSQL, в
Picodata реализована поддержка эфемерной схемы данных `public`
(используется в PostgreSQL по умолчанию).

Имя `public` можно указать в виде префикса для объектов, находящихся в
схеме данных (таблиц, индексов, процедур и т.д.). Примеры равнозначных
запросов:

```sql title="Получение данных таблицы"
SELECT * FROM _pico_table;
SELECT * FROM public._pico_table;
```

```sql title="Получение данных колонки таблицы"
SELECT _pico_table.id FROM _pico_table;
SELECT public._pico_table.id FROM public._pico_table;
```

```sql title="Создание процедуры"
CREATE PROCEDURE public.proc (int, text, text) AS $$INSERT INTO warehouse VALUES($1, $2, $3)$$;
CREATE PROCEDURE "public".proc(int, text, text) AS $$INSERT INTO warehouse VALUES($1, $2, $3)$$;
```
