创建这样的表时
CREATE TABLE `dummy` (
`userid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`providerid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`provideruserid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
并定义如下的PK:
ALTER TABLE dummy ADD PRIMARY KEY (userid,providerid,provideruserid);
我收到此错误:
Error: Specified key was too long; max key length is 767 bytes
我认为以下设置正确,因此很可能不是问题:
innodb_file_format=Barracuda
innodb_file_per_table=ON
innodb_large_prefix=ON
表格存储格式很可能在这里引起问题,但我无法检查定义的默认值。
根据{{3}},MariaDB的默认表存储格式(自10.2.2起)为DYNAMIC
- 如果它是DYNAMIC
那么这将是完美的,但这似乎不是情况下。
有没有人知道Swisscom MariaDB Ent中的默认表格存储格式。为什么它不是DYNAMIC
? (可能:))
答案 0 :(得分:2)
我们在Prd的MariaDB版本:
select VERSION();
+-----------------+
| VERSION() |
+-----------------+
| 10.1.22-MariaDB |
+-----------------+
1 row in set (0.00 sec)
引自MariaDB KB XtraDB/InnoDB Storage Formats
Compact
Compact
是MariaDB 10.2.1之前的默认格式,并且是合适的 用于一般用途,如果使用Antelope文件格式。它被介绍了 在MySQL 5.0中。采用
Compact
存储格式(如Redundant中)BLOB
和TEXT
列 部分存储在行页面中。至少存储767个字节 排;超过此值的值存储在专用值中 页面。由于Compact
和冗余行的最大大小约为8000 bytes,这限制了可以使用的BLOB
或TEXT
列的数量 在一张桌子里。无论数据大小如何,每个BLOB
页面都是16KB。其他列也可以存储在不同的页面中,如果它们超过了 行页面的大小限制。
我们在实验室中的MariaDB版本(很快将部署在Prd上)。这是relevant line in bosh release。
select VERSION();
+-----------------+
| VERSION() |
+-----------------+
| 10.1.26-MariaDB |
+-----------------+
1 row in set (0.00 sec)
如何修复Swisscom Application Cloud上的错误ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
(查看差异ROW_FORMAT=DYNAMIC
):
MariaDB [stackoverflow]> CREATE TABLE `dummy` (
-> `userid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
-> `providerid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
-> `provideruserid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
-> ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.02 sec)
MariaDB [stackoverflow]> ALTER TABLE dummy ADD PRIMARY KEY (userid,providerid,provideruserid);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [stackoverflow]> show index from dummy;
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| dummy | 0 | PRIMARY | 1 | userid | A | 0 | NULL | NULL | | BTREE | | |
| dummy | 0 | PRIMARY | 2 | providerid | A | 0 | NULL | NULL | | BTREE | | |
| dummy | 0 | PRIMARY | 3 | provideruserid | A | 0 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
这里是复制和粘贴的代码:
CREATE TABLE `dummy`
(
`userid` VARCHAR(255) collate utf8mb4_unicode_ci NOT NULL,
`providerid` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`provideruserid` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL
)
engine=innodb row_format=dynamic DEFAULT charset=utf8mb4 COLLATE=utf8mb4_unicode_ci;