Oracle兼容-语法-TABLE UDT


1. 语法

  1. 1. CREATE TABLE table_name(column_name type, column_name type ...)
  2. typenomally type/udt type:[db.]type(不支持varray/table类型udt).
  3. 2. INSERT INTO table_name VALUES(values)
  4. values:nomally value/udt value
  5. udt value:[db.]udt_name(values)
  6. 3. ALTER TABLE table_name DROP/ADD [column] column_name udt_type
  7. udt_type:[db.]udt_name(values)
  8. 4. set @@udt_format_result=['BINARY'/'DBA'];

需要先切换到 ORACLE 模式下才能支持本语法。

2. 定义和用法

GreatSQL支持用户自定义TABLE类型,支持以下几种用法:

  • 语法1:执行 CREATE TABLE(udt_name udt_type) 创建UDT列。

  • 语法2:向UDT列插入UDT值。

  • 语法3:添加和删除UDT列(注:alter不支持modify操作)。

  • 语法4:可设置 udt_format_result 会话选项指定UDT类型数据的输出格式。

GreatSQL的TABLE UDT有以下几条限制:

  1. TABLE UDT不能跨Schema使用。

  2. 在ORACLE模式下,关键词 TYPE 不能作为Schema名或User名。

  3. 目前只支持 name = udt_type() 函数,UDT列不支持用在其他内置函数。

  4. UDT列不支持 TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB 等几个数据类型。

3. Oracle兼容说明

GreatSQL中的TABLE UDT与Oracle兼容情况说明如下:

  1. 不支持对UDT列设定默认值,也不支持设置为 PRIMARY KEY/FOREIGN KEY/CONSTRAINT/NULL/NOT NULL/INVISIBLE/VIRTUAL 等属性。

  2. 只允许对UDT列插入UDT值,其他类型值不允许插入UDT列;UDT值也不允许插入其他类型列。

  3. 不支持对UDT列执行 CREATE INDEX/ORDER BY/GROUP BY/PARTITION BY/CREATE VIEW/ALTER MODIFY 等操作行为。

  4. 只能添加和删除UDT列,不支持 MODIFY 修改UDT列。

  5. 支持 CREATE VIEW,mysql.routines的table_count值不改变。区别是如果使用udt type的table删除而view没有删除,也支持删除该udt type。

  6. UDT列的成员列不允许单独使用在独立的SQL语句中,比如 udt_type.id 这种用法(Oracle支持该用法)。

  7. UDT列不支持用在大部分内置函数中,除了在查询条件中用于比大小以及 ISNULL/IS NOT NULL,比如 WHERE c1 = udt_type1(1, 'r1')

  8. UDT列不支持 CREATE TEMPORARY TABLE 用法。

  9. 执行 SHOW CREATE TABLE WITH udt_type 显示的UDT列类型就是TYPE的名字。

  10. 选项udt_format_result 默认值为 BINARY,即输出结果显式为BINARY格式,否则正常显示格式(udt_format_result = DBA)。

  11. 不支持 BLOB/MEDIUM_BLOB/LONG_BLOB/TINY_BLOB 等数据类型。

  12. 对于跨库表的操作,要求UDT type和UDT table指定的Schema名一致,具体如下:

  1. greatsql> use greatsql;
  2. -- 下例中的 udt_type1 等同于 greatsql.udt_type1
  3. -- 此时t1会创建失败,因为t1db2中,而udt_type1greatsql中,不在同一个Schema
  4. greatsql> CREATE TABLE db2.t1(id INT, u1 udt_type1);
  5. -- 下例中 udt_type1 等同于 greatsql.udt_type1
  6. -- 此时插入失败,因为t1db2中,而udt_type1greatsql中,不在同一个Schema
  7. greatsql> INSERT INTO db2.t1 VALUES(1, udt_type1(1, 'a'));这里的udt_type1指的是db1.udt_type1.
  8. -- 需要修改成下面这样
  9. greatsql> INSERT INTO db2.t1 VALUES(1, db2.udt_type1(1, 'a'));
  10. -- 这里指的是db1.udt_type1,如果想成功创建,需要指定db2.udt_type1
  11. greatsql> ALTER TABLE db2.t1 ADD c2 udt_type1;
  1. 插入语句 INSERT INTO t1 VALUES udt_type(NULL)INSERT INTO t1 VALUES(NULL) 实际写入值是不一样的,写入完后执行 SELECT * FROM t1 WHERE udt_type IS NULL 查询的结果是后者,而非前者。

  2. 在类似 SELECT * FROM t1 WHERE udt_type1 [<|=|>] udt_type1 的比较查询中,如果是字符串则会按照 BINARY 格式进行比较;而在Oracle中是当小于或者大于的时候直接报错,而等于的时候直接返回空值。这点与Oracle不一致。

  3. 在类似 SELECT * FROM t1 WHERE udt_type1 [<|=|>] udt_type2 的比较查询中,由于 udt_type1udt name 不等于 udt_type2udt name,所以会报错;而Oracle是在等于查询的时候直接返回空值,这点与Oracle不一致。

  4. 通过查询系统表 information_schema.COLUMNSextra 列中是否带有 udt_name 信息,就可知道哪些表的列带有udt类型。例如:

  1. greatsql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, EXTRA FROM information_schema.COLUMNS WHERE TABLE_NAME = 'udt_t1';
  2. +--------------+------------+-------------+-----------+-----------------+
  3. | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | DATA_TYPE | EXTRA |
  4. +--------------+------------+-------------+-----------+-----------------+
  5. | greatsql | udt_t1 | id | int | |
  6. | greatsql | udt_t1 | c1 | udt1 | udt_name="udt1" |
  7. +--------------+------------+-------------+-----------+-----------------+
  8. 2 rows in set (0.00 sec)

4. 示例

    1. 示例1:CREATE TABLE 用法
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  3. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  4. -- 不支持的用法
  5. greatsql> CREATE OR REPLACE TYPE udt_t1 IS TABLE OF INT;
  6. greatsql> CREATE TABLE t1(id INT, c1 udt_t1);
  7. ERROR 1235 (42000): This version of MySQL doesn't yet support 'create table with udt table'
    1. 示例2:INSERT INTO TABLE 用法
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> set udt_format_result = 'DBA';
  3. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  4. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  5. greatsql> INSERT INTO udt_t1 VALUES(1, udt1(1, 'c1_row1'));
  6. greatsql> SELECT * FROM udt_t1;
  7. +------+-------------------+
  8. | id | c1 |
  9. +------+-------------------+
  10. | 1 | id:1 | c1:c1_row1 |
  11. +------+-------------------+
  12. 1 row in set (0.00 sec)
    1. 示例3:ALTER TABLE ADD
  1. greatsql> SET SQL_MODE=ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  3. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  4. greatsql> ALTER TABLE udt_t1 ADD c2 udt1;
  5. Query OK, 0 rows affected (0.00 sec)
  6. Records: 0 Duplicates: 0 Warnings: 0
  7. greatsql> SHOW CREATE TABLE udt_t1\G
  8. *************************** 1. row ***************************
  9. Table: udt_t1
  10. Create Table: CREATE TABLE `udt_t1` (
  11. `id` int DEFAULT NULL,
  12. `c1` udt1 DEFAULT NULL,
  13. `c2` udt1 DEFAULT NULL
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  15. 1 row in set (0.00 sec)
    1. 示例4:ALTER TABLE DROP
  1. greatsql> SET SQL_MODE=ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  3. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  4. greatsql> ALTER TABLE udt_t1 ADD c2 udt1;
  5. greatsql> ALTER TABLE udt_t1 DROP c2;
  6. greatsql> SHOW CREATE TABLE udt_t1\G
  7. *************************** 1. row ***************************
  8. Table: udt_t1
  9. Create Table: CREATE TABLE `udt_t1` (
  10. `id` int DEFAULT NULL,
  11. `c1` udt1 DEFAULT NULL
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1. 示例5:DROP TABLE/DROP TYPE
  1. greatsql> SET sql_mode = ORACLE;
  2. -- 删除UDT前,要先删除关联的表,否则会失败
  3. greatsql> DROP TYPE udt1;
  4. ERROR 7549 (HY000): Failed to drop type t_air with type or table dependents.
  5. greatsql> DROP TABLE udt_t1;
  6. Query OK, 0 rows affected (0.00 sec)
  7. greatsql> DROP TYPE udt1;
  8. Query OK, 0 rows affected (0.00 sec)
    1. 示例6:CREATE VIEW
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  3. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  4. greatsql> CREATE VIEW v1 AS SELECT * FROM udt_t1;
  5. greatsql> SHOW CREATE VIEW v1\G
  6. *************************** 1. row ***************************
  7. View: v1
  8. Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS SELECT `udt_t1`.`id` AS `id`,`udt_t1`.`c1` AS `c1` from `udt_t1`
  9. character_set_client: utf8mb4
  10. collation_connection: utf8mb4_0900_ai_ci
    1. 示例7:查询与函数
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> SET udt_format_result = 'DBA';
  3. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  4. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  5. greatsql> INSERT INTO udt_t1 VALUES(1, udt1(1, 'c1_row1')), (2, udt1(2, 'c1_row2'));
  6. greatsql> SELECT * FROM udt_t1;
  7. +------+-------------------+
  8. | id | c1 |
  9. +------+-------------------+
  10. | 1 | id:1 | c1:c1_row1 |
  11. | 2 | id:2 | c1:c1_row2 |
  12. +------+-------------------+
  13. 2 rows in set (0.00 sec)
  14. greatsql> SELECT * FROM udt_t1 WHERE c1 = udt1(1, 'c1_row1');
  15. +------+-------------------+
  16. | id | c1 |
  17. +------+-------------------+
  18. | 1 | id:1 | c1:c1_row1 |
  19. +------+-------------------+
  20. 1 row in set (0.00 sec)
  21. greatsql> SELECT c1 || udt1(3, 'c1_row3') FROM udt_t1;
  22. ERROR 1235 (42000): This version of MySQL doesn't yet support 'udt type columns used in function'
  23. greatsql> SELECT c1 FROM udt_t1 GROUP BY c1;
  24. ERROR 7548 (HY000): cannot ORDER objects without window function or ORDER method
  25. greatsql> ALTER TABLE udt_t1 ADD c2 udt1;
  26. greatsql> SELECT * FROM udt_t1;
  27. +------+-------------------+------+
  28. | id | c1 | c2 |
  29. +------+-------------------+------+
  30. | 1 | id:1 | c1:c1_row1 | NULL |
  31. | 2 | id:2 | c1:c1_row2 | NULL |
  32. +------+-------------------+------+
  33. 2 rows in set (0.00 sec)
  34. greatsql> SELECT * FROM udt_t1 WHERE c2 IS NULL;
  35. +------+-------------------+------+
  36. | id | c1 | c2 |
  37. +------+-------------------+------+
  38. | 1 | id:1 | c1:c1_row1 | NULL |
  39. | 2 | id:2 | c1:c1_row2 | NULL |
  40. +------+-------------------+------+
  41. 2 rows in set (0.00 sec)
  42. greatsql> SELECT * FROM udt_t1 WHERE ISNULL(c2);
  43. +------+-------------------+------+
  44. +------+-------------------+------+
  45. | id | c1 | c2 |
  46. +------+-------------------+------+
  47. | 1 | id:1 | c1:c1_row1 | NULL |
  48. | 2 | id:2 | c1:c1_row2 | NULL |
  49. +------+-------------------+------+
  50. greatsql> UPDATE udt_t1 SET c2 = c1 WHERE id = 1;
  51. Query OK, 1 row affected (0.00 sec)
  52. Rows matched: 1 Changed: 1 Warnings: 0
  53. greatsql> SELECT * FROM udt_t1;
  54. +------+-------------------+-------------------+
  55. | id | c1 | c2 |
  56. +------+-------------------+-------------------+
  57. | 1 | id:1 | c1:c1_row1 | id:1 | c1:c1_row1 |
  58. | 2 | id:2 | c1:c1_row2 | NULL |
  59. +------+-------------------+-------------------+
  60. 2 rows in set (0.00 sec)
  61. greatsql> SELECT c2 = c1, c2 > c1, c2 < c1 FROM udt_t1;
  62. +---------+---------+----------+
  63. | c2 = c1 | c2 > c1 | c2 < c1 |
  64. +---------+---------+----------+
  65. | 1 | 0 | 0 |
  66. | NULL | NULL | NULL |
  67. +---------+---------+----------+
  68. 2 rows in set (0.00 sec)
    1. 示例8:UPDATE SET
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> SET udt_format_result = 'DBA';
  3. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  4. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  5. greatsql> INSERT INTO udt_t1 VALUES(1, udt1(1, 'c1_row1')), (2, udt1(2, 'c1_row2'));
  6. greatsql> SELECT * FROM udt_t1;
  7. +------+-------------------+
  8. | id | c1 |
  9. +------+-------------------+
  10. | 1 | id:1 | c1:c1_row1 |
  11. | 2 | id:2 | c1:c1_row2 |
  12. +------+-------------------+
  13. 2 rows in set (0.00 sec)
  14. greatsql> UPDATE udt_t1 SET c1 = udt1(50, 'c1_row1') WHERE id = 1;
  15. Query OK, 1 row affected (0.00 sec)
  16. Rows matched: 1 Changed: 1 Warnings: 0
  17. greatsql> SELECT * FROM udt_t1;
  18. +------+--------------------+
  19. | id | c1 |
  20. +------+--------------------+
  21. | 1 | id:50 | c1:c1_row1 |
  22. | 2 | id:2 | c1:c1_row2 |
  23. +------+--------------------+
  24. 2 rows in set (0.00 sec)
    1. 示例9:CURSOR
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> SET udt_format_result = 'DBA';
  3. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  4. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  5. greatsql> INSERT INTO udt_t1 VALUES(1, udt1(1, 'c1_row1')), (2, udt1(2, 'c1_row2'));
  6. greatsql> SELECT * FROM udt_t1;
  7. +------+-------------------+
  8. | id | c1 |
  9. +------+-------------------+
  10. | 1 | id:1 | c1:c1_row1 |
  11. | 2 | id:2 | c1:c1_row2 |
  12. +------+-------------------+
  13. 2 rows in set (0.00 sec)
  14. greatsql> DELIMITER //
  15. greatsql> CREATE OR REPLACE PROCEDURE p1() AS
  16. CURSOR cur1 (i_id INT) IS SELECT * FROM udt_t1 WHERE id = i_id;
  17. rec cur1%ROWTYPE;
  18. BEGIN
  19. FOR rec IN cur1(2)
  20. LOOP
  21. SELECT rec.id, rec.c1;
  22. END LOOP;
  23. END; //
  24. greatsql> CALL p1() //
  25. +--------+-------------------+
  26. | rec.id | rec.c1 |
  27. +--------+-------------------+
  28. | 2 | id:2 | c1:c1_row2 |
  29. +--------+-------------------+
  30. 1 row in set (0.00 sec)
  31. Query OK, 0 rows affected (0.00 sec)
    1. 示例10:%TYPE
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> SET udt_format_result = 'DBA';
  3. greatsql> CREATE OR REPLACE TYPE udt1 AS OBJECT(id INT, c1 CHAR(20));
  4. greatsql> CREATE TABLE udt_t1(id INT, c1 udt1);
  5. greatsql> INSERT INTO udt_t1 VALUES(1, udt1(1, 'c1_row1')), (2, udt1(2, 'c1_row2'));
  6. greatsql> SELECT * FROM udt_t1;
  7. +------+-------------------+
  8. | id | c1 |
  9. +------+-------------------+
  10. | 1 | id:1 | c1:c1_row1 |
  11. | 2 | id:2 | c1:c1_row2 |
  12. +------+-------------------+
  13. 2 rows in set (0.00 sec)
  14. greatsql> DELIMITER //
  15. greatsql> CREATE OR REPLACE PROCEDURE p1(min INT,max INT) AS
  16. CURSOR cur(pmin INT, pmax INT) IS SELECT c1 FROM udt_t1 WHERE id BETWEEN pmin AND pmax;
  17. v_c1 udt_t1.c1%TYPE;
  18. BEGIN
  19. OPEN cur(min, max);
  20. LOOP
  21. FETCH cur INTO v_c1;
  22. EXIT WHEN cur%NOTFOUND;
  23. SELECT v_c1;
  24. END LOOP;
  25. CLOSE cur;
  26. END; //
  27. greatsql> CALL p1(1,10) //
  28. +-------------------+
  29. | v_c1 |
  30. +-------------------+
  31. | id:1 | c1:c1_row1 |
  32. +-------------------+
  33. 1 row in set (0.00 sec)
  34. +-------------------+
  35. | v_c1 |
  36. +-------------------+
  37. | id:2 | c1:c1_row2 |
  38. +-------------------+
  39. 1 row in set (0.00 sec)
  40. Query OK, 0 rows affected (0.00 sec)
    1. 示例11:udt_format_result

客户端建立新连接,加上参数 --binary-as-hex

  1. $ mysql -A -S/data/GreatSQL/mysql.sock --binary-as-hex greatsql
  2. -- 建立连接时,加上--binary-as-hex就会有下面的标识
  3. greatsql> \s
  4. ...
  5. Binary data as: Hexadecimal
  6. ...
  7. -- 参数udt_format_result默认值为BINARY
  8. greatsql> SELECT @@udt_format_result;
  9. +---------------------+
  10. | @@udt_format_result |
  11. +---------------------+
  12. | BINARY |
  13. +---------------------+
  14. greatsql> SELECT * FROM udt_t1;
  15. +------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  16. | id | c1 |
  17. +------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  18. | 1 | 0xFC0100000063315F726F773120202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 |
  19. | 2 | 0xFC0200000063315F726F773220202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 |
  20. +------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  21. 2 rows in set (0.00 sec)
  22. -- 修改 udt_format_result = 'DBA'
  23. greatsql> SET udt_format_result = 'DBA';
  24. greatsql> SELECT * FROM udt_t1;
  25. +------+-------------------+
  26. | id | c1 |
  27. +------+-------------------+
  28. | 1 | id:1 | c1:c1_row1 |
  29. | 2 | id:2 | c1:c1_row2 |
  30. +------+-------------------+
  31. 2 rows in set (0.00 sec)

5. TABLE UDT数据字典

  1. -- 1. 查询 information_schema.ROUTINES 查看所有 UDT
  2. greatsql> SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'UDT1'\G
  3. *************************** 1. row ***************************
  4. SPECIFIC_NAME: udt1
  5. ROUTINE_CATALOG: def
  6. ROUTINE_SCHEMA: greatsql
  7. ROUTINE_NAME: udt1
  8. ROUTINE_TYPE: TYPE
  9. DATA_TYPE:
  10. CHARACTER_MAXIMUM_LENGTH: NULL
  11. CHARACTER_OCTET_LENGTH: NULL
  12. NUMERIC_PRECISION: NULL
  13. NUMERIC_SCALE: NULL
  14. DATETIME_PRECISION: NULL
  15. CHARACTER_SET_NAME: NULL
  16. COLLATION_NAME: NULL
  17. DTD_IDENTIFIER: NULL
  18. ROUTINE_BODY: SQL
  19. ROUTINE_DEFINITION:
  20. EXTERNAL_NAME: NULL
  21. EXTERNAL_LANGUAGE: SQL
  22. PARAMETER_STYLE: SQL
  23. IS_DETERMINISTIC: NO
  24. SQL_DATA_ACCESS: CONTAINS SQL
  25. SQL_PATH: NULL
  26. SECURITY_TYPE: DEFINER
  27. CREATED: 2023-11-21 13:51:40
  28. LAST_ALTERED: 2023-11-21 13:51:47
  29. SQL_MODE: PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ORACLE,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  30. ROUTINE_COMMENT:
  31. DEFINER: root@localhost
  32. CHARACTER_SET_CLIENT: utf8mb4
  33. COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  34. DATABASE_COLLATION: utf8mb4_0900_ai_ci
  35. 1 row in set (0.00 sec)
  36. -- 2. 查询 information_schema.PARAMETERS 查看UDT定义
  37. greatsql> SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'udt1'\G
  38. *************************** 1. row ***************************
  39. SPECIFIC_CATALOG: def
  40. SPECIFIC_SCHEMA: greatsql
  41. SPECIFIC_NAME: udt1
  42. ORDINAL_POSITION: 1
  43. PARAMETER_MODE: IN
  44. PARAMETER_NAME: id
  45. DATA_TYPE: int
  46. CHARACTER_MAXIMUM_LENGTH: NULL
  47. CHARACTER_OCTET_LENGTH: NULL
  48. NUMERIC_PRECISION: 10
  49. NUMERIC_SCALE: 0
  50. DATETIME_PRECISION: NULL
  51. CHARACTER_SET_NAME: NULL
  52. COLLATION_NAME: NULL
  53. DTD_IDENTIFIER: int
  54. ROUTINE_TYPE: TYPE
  55. *************************** 2. row ***************************
  56. SPECIFIC_CATALOG: def
  57. SPECIFIC_SCHEMA: greatsql
  58. SPECIFIC_NAME: udt1
  59. ORDINAL_POSITION: 2
  60. PARAMETER_MODE: IN
  61. PARAMETER_NAME: c1
  62. DATA_TYPE: char
  63. CHARACTER_MAXIMUM_LENGTH: 20
  64. CHARACTER_OCTET_LENGTH: 80
  65. NUMERIC_PRECISION: NULL
  66. NUMERIC_SCALE: NULL
  67. DATETIME_PRECISION: NULL
  68. CHARACTER_SET_NAME: utf8mb4
  69. COLLATION_NAME: utf8mb4_0900_ai_ci
  70. DTD_IDENTIFIER: char(20)
  71. ROUTINE_TYPE: TYPE
  72. 2 rows in set (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx