首批通过分布式安全可靠测评,为关键业务系统打造
MySQL 租户大小写敏感时的 Hint 使用说明
更新时间:2026-05-29 08:46
本文主要介绍 OceanBase 数据库 MySQL 租户配置大小写敏感后,Hint 中对象名的使用方式。 当大小写敏感时,Hint 中的表名(或别名)不仅需要注意大小写,还需要添加反引号 ``(MySQL 模式)或双引号 ""(Oracle 模式),否则 Hint 中的表名将无法匹配,将会出现 Hint 不生效的情况。
详细说明
参数及用法介绍
lower_case_table_names 变量用于设置租户是否对大小写敏感。该变量仅适用于 OceanBase 数据库的 MySQL 租户,且仅对 Database 和 Table 对象名(别名)生效。 该变量仅在创建 MySQL 租户时指定,当租户创建完成后,不支持通过 SQL 语句进行修改。变量相关属性如下。
| 属性 | 描述 |
|---|---|
| 参数类型 | int |
| 默认值 | 1 |
| 取值范围 |
|
| 生效范围 | Global |
| 是否可修改 | 否,该变量仅支持使用 CREATE TENANT 语句创建租户时指定,租户创建后不能通过 SQL 语句修改。 |
关于 Global 系统变量 lower_case_table_names 的详情介绍请参见:lower_case_table_names。 在 MySQL 租户中,当系统变量 lower_case_table_names 设置为大小写敏感时,Hint 中的表名(或别名)不仅需要注意大小写,还需要添加反引号 ``,否则 Hint 中的表名将无法匹配,将会出现 Hint 不生效的情况。
场景示例
测试环境系统变量 lower_case_table_names 确认如下,变量值为 0,即表名将按照指定的大小写形式进行存储,并以区分大小写形式进行比较。
obclient [test]> SHOW VARIABLES LIKE 'lower_case_table_names';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
1 row in set (0.002 sec)
正确示例
正确用法如下,别名 T 大写的同时,使用了反引号 ``,Hint 生效。
obclient [test]> EXPLAIN SELECT /*+ FULL(`T`) */ c1,c2 FROM t1 T WHERE C2 < 100;
+------------------------------------------------------------------------------------+
| Query Plan |
+------------------------------------------------------------------------------------+
| =============================================== |
| |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| |
| ----------------------------------------------- |
| |0 |TABLE FULL SCAN|T |1 |4 | |
| =============================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T.c1], [T.c2]), filter([T.c2 < 100]), rowset=16 |
| access([T.c1], [T.c2]), partitions(p0) |
| is_index_back=false, is_global_index=false, filter_before_indexback[false], |
| range_key([T.c1]), range(MIN ; MAX)always true |
+------------------------------------------------------------------------------------+
11 rows in set (0.002 sec)
错误示例
如下为错误使用示例,虽然在 Hint 中按照别名使用了大写 T,但由于没有加反引号 ``,别名无法被匹配,Hint 无法生效。
obclient [test]> EXPLAIN SELECT /*+ FULL(T) */ c1,c2 FROM t1 T WHERE C2 < 100;
+--------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------+
| ===================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ----------------------------------------------------- |
| |0 |TABLE RANGE SCAN|T(Idx_c2)|1 |4 | |
| ===================================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T.c1], [T.c2]), filter(nil), rowset=16 |
| access([T.c1], [T.c2]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T.c2], [T.c1]), range(NULL,MAX ; 100,MIN), |
| range_cond([T.c2 < 100]) |
+--------------------------------------------------------------+
12 rows in set (0.002 sec)
如下为错误使用示例,虽然在 Hint 中按照别名使用了大写 T,但由于使用的是双引号 ""(Oracle 模式可使用双引号),而不是可被识别的反引号 ``,别名无法被匹配,Hint 无法生效。
obclient [test]> EXPLAIN SELECT /*+ FULL("T") */ c1,c2 FROM t1 T WHERE C2 < 100;
+--------------------------------------------------------------+
| Query Plan |
+--------------------------------------------------------------+
| ===================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ----------------------------------------------------- |
| |0 |TABLE RANGE SCAN|T(Idx_c2)|1 |4 | |
| ===================================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T.c1], [T.c2]), filter(nil), rowset=16 |
| access([T.c1], [T.c2]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T.c2], [T.c1]), range(NULL,MAX ; 100,MIN), |
| range_cond([T.c2 < 100]) |
+--------------------------------------------------------------+
12 rows in set (0.002 sec)
适用版本
OceanBase 数据库 V4.x 版本。