字符串空格判断问题

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】V4.3.5社区版本MYSQL模式
【问题描述】在OceanBase中’’ 和 ’ ‘被视为相等?和MySQL行为不一致
【复现路径】select ‘’=’ ’ 或者select 'a ’ = 'a’均返回1;MySQL中返回0

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

3 个赞

在您提到的情况下,OceanBase 和 MySQL 在处理空字符串和包含空格的字符串时存在行为上的差异。这种情况可能是由于OceanBase中特定的字符串比较或处理规则导致的。虽然这不是一个典型的性能或者可用性问题,但它可能会影响应用程序的行为,特别是当应用程序依赖于字符串的精确比较时。

不过,从您的描述来看,这个问题似乎更多地涉及到配置或者数据库的行为特性,而不是一个明显的故障或者异常,因此直接使用 obdiag 来诊断可能不是最有效的方式。但是,如果您希望进一步了解为什么会有这样的行为,可以考虑使用 obdiag 收集一些关于系统配置的信息,以便更好地理解当前环境下的设置。

可选操作:

日志采集场景: 集群基础信息
日志采集命令: obdiag gather scene run --scene=observer.base

通过上述命令收集的集群基础信息可以帮助我们检查系统配置,例如字符集设置、比较方式等,这些都可能影响字符串的比较行为。

提供更多信息:

为了更好地帮助您解决这一问题,请您提供以下信息:

  1. 当前使用的OceanBase的具体版本信息(包括补丁版本)。
  2. 是否对OceanBase进行了任何特殊配置,特别是与字符集和排序规则相关的配置。
  3. 能否提供一个具体的示例,展示在OceanBase中空字符串和包含空格的字符串被视为相等的情况?
  4. 在MySQL中同样的数据是否确实表现为不等,以及所使用的MySQL版本。
  5. 如果可能的话,提供创建表的DDL语句,以及用于插入或比较数据的SQL语句。

通过上述信息,我们将能够更准确地定位问题的原因,并提供更具体的解决方案。

附上敏捷诊断工具 obdiag 使用帮助链接

2 个赞

能发一下 截图么?可能字符你发到帖子上 会有转义 不好做判断

1 个赞


我OceanBase sql_mode=PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
字符集和排序集合是utf8mb4,utf8mb4_bin
mysql是8.0.36版本,sql_mode=PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
字符集和排序集合是utf8mb4,utf8mb4_bin

3 个赞

上面的截图 是在mysql上操作的 还是在ob上操作的

1 个赞

ob上操作的。
MySQL的结果截图看这个

3 个赞

现在的行为是兼容MySQL 5.7的。
MySQL 5.7

 select version();
+------------+
| version()  |
+------------+
| 5.7.20-log |
+------------+
1 row in set (0.00 sec)

 select ''=' ','a '='a',' a'='a';
+--------+----------+----------+
| ''=' ' | 'a '='a' | ' a'='a' |
+--------+----------+----------+
|      1 |        1 |        0 |
+--------+----------+----------+
1 row in set (0.00 sec)

OB:

> select version();
+----------------------------+
| version()                  |
+----------------------------+
| 5.7.25-OceanBase-v4.2.1.10 |
+----------------------------+
1 row in set (0.001 sec)

> select ''=' ','a '='a',' a'='a';
+--------+----------+----------+
| ''=' ' | 'a '='a' | ' a'='a' |
+--------+----------+----------+
|      1 |        1 |        0 |
+--------+----------+----------+
1 row in set (0.001 sec)

2 个赞

感觉还是oracle 的语法最靠谱

那这种情况,OceanBase有什么参数能够调整这种行为,能够和8版本的MySQL行为保持一致吗?

1 个赞

8.x

,5.7
应该没有办法调整 应该还是不完全兼容
设置8.x的客户端和连接的字符集utf8mb3 就是一样