@@ -256,6 +256,84 @@ ORDER BY
256256
257257更多信息,请参考[ 字符集和排序规则] ( /character-set-and-collation.md ) 。
258258
259+ ### 索引长度
260+
261+ 如下例所示,在 MariaDB 中,如果索引长度超过最大键长度,MariaDB 会自动将该索引转换为前缀索引,并返回警告。与 MariaDB 不同,TiDB 遵循 MySQL 的行为,不会执行这种自动转换,而是直接返回错误。因此,在将 MariaDB DDL 迁移到 TiDB 时,如果索引列可能超过 TiDB 支持的最大键长度,你需要修改你的脚本,显式创建前缀索引。
262+
263+ ```
264+ MariaDB> \W
265+ Show warnings enabled.
266+ MariaDB> CREATE TABLE t1(id SERIAL, c1 VARCHAR(800));
267+ Query OK, 0 rows affected (0.024 sec)
268+
269+ MariaDB> ALTER TABLE t1 ADD INDEX(c1);
270+ Query OK, 0 rows affected, 1 warning (0.031 sec)
271+ Records: 0 Duplicates: 0 Warnings: 1
272+
273+ Note (Code 1071): Specified key was too long; max key length is 3072 bytes
274+ MariaDB> SHOW CREATE TABLE t1\G
275+ *************************** 1. row ***************************
276+ Table: t1
277+ Create Table: CREATE TABLE `t1` (
278+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
279+ `c1` varchar(800) DEFAULT NULL,
280+ UNIQUE KEY `id` (`id`),
281+ KEY `c1` (`c1`(768))
282+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
283+ 1 row in set (0.001 sec)
284+ ```
285+
286+ 对于超过最大键长度的唯一索引,MariaDB 也会进行特殊处理。例如,在以下示例中,MariaDB 会为 ` TEXT ` 列创建 ` USING HASH ` 的唯一索引。TiDB 不提供此功能。
287+
288+ ```
289+ MariaDB> CREATE TABLE t2 (id SERIAL PRIMARY KEY, c1 TEXT NOT NULL);
290+ Query OK, 0 rows affected (0.015 sec)
291+
292+ MariaDB> ALTER TABLE t2 ADD INDEX regular_index_c1 (c1);
293+ Query OK, 0 rows affected, 1 warning (0.034 sec)
294+ Records: 0 Duplicates: 0 Warnings: 1
295+
296+ Note (Code 1071): Specified key was too long; max key length is 3072 bytes
297+ MariaDB> ALTER TABLE t2 ADD UNIQUE INDEX unique_index_c1 (c1);
298+ Query OK, 0 rows affected (0.048 sec)
299+ Records: 0 Duplicates: 0 Warnings: 0
300+
301+ MariaDB> SHOW CREATE TABLE t2\G
302+ *************************** 1. row ***************************
303+ Table: t2
304+ Create Table: CREATE TABLE `t2` (
305+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
306+ `c1` text NOT NULL,
307+ PRIMARY KEY (`id`),
308+ UNIQUE KEY `unique_index_c1` (`c1`) USING HASH,
309+ KEY `regular_index_c1` (`c1`(768))
310+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
311+ 1 row in set (0.001 sec)
312+ ```
313+
314+ 如需在 TiDB 中对长文本列进行唯一性约束,可以添加一个生成的哈希列,并在该生成的哈希列上创建唯一索引,如下所示:
315+
316+ ```
317+ tidb> CREATE TABLE t1 (id int PRIMARY KEY, c1 TEXT NOT NULL);
318+ Query OK, 0 rows affected (0.102 sec)
319+
320+ tidb> ALTER TABLE t1 ADD COLUMN c1_hash BINARY(32) AS (UNHEX(SHA2(c1,256)));
321+ Query OK, 0 rows affected (0.242 sec)
322+
323+ tidb> ALTER TABLE t1 ADD UNIQUE KEY (c1_hash);
324+ Query OK, 0 rows affected (0.363 sec)
325+
326+ tidb> INSERT INTO t1(id,c1) VALUES (1,'aaa');
327+ Query OK, 1 row affected (0.015 sec)
328+
329+ tidb> INSERT INTO t1(id,c1) VALUES (2,'bbb');
330+ Query OK, 1 row affected (0.006 sec)
331+
332+ tidb> INSERT INTO t1(id,c1) VALUES (3,'aaa');
333+ ERROR 1062 (23000): Duplicate entry '\x984\x87m\xCF\xB0\\xB1g\xA5\xC2IS\xEB\xA5\x8CJ\xC8\x9B\x1A\xDFW' for key 't1.c1_hash'
334+ tidb>
335+ ```
336+
259337## 使用 Dumpling 导出数据后使用 TiDB Lightning 导入
260338
261339该迁移策略假定你将应用程序下线,迁移数据,然后重新配置应用程序以使用迁移后的数据。
0 commit comments