Из документов на массивах (выделение добавлено):
Синтаксис для CREATE TABLE позволяет указать точный размер массивов, например:
CREATE TABLE tictactoe (
squares integer[3][3]
);
Однако текущая реализация игнорирует любые предоставленные ограничения размера массива, т. Е. Поведение такое же, как и для массивов неопределенной длины.
В текущей реализации также не применяется объявленное количество измерений. Считается, что массивы определенного типа элементов относятся к одному и тому же типу независимо от размера или количества измерений. Итак, объявление размера массива или количества измерений в CREATE TABLE
- это просто документация; это не влияет на поведение во время выполнения.
Таким образом, в действительности нет многомерного типа массива. Чтобы устранить проблему, просто измените значение по умолчанию с {{}}
на {}
.
Это означает, что varchar[][]
того же типа, что и varchar[]
:
db=# select pg_typeof(a), pg_typeof(b) from (values ('{{hello},{world}}'::varchar[][], '{foo}'::varchar[])) x(a, b);
pg_typeof | pg_typeof
---------------------+---------------------
character varying[] | character varying[]
(1 row)
Вы все равно сможете хранить многомерные данные.
Одно и двухмерный массив не совпадают:
db=# select '{{foo}}'::varchar[] = '{foo}'::varchar[];
?column?
----------
f
(1 row)