U0400023:GaussDB不支持BINARY特性
描述
数据库类型与版本
- 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。
- 目标库类型与版本:GaussDB所有版本。
语法示例
当SELECT查询语句中使用了BINARY关键字来区分大小写时,将生成此错误提示。
在MySQL中建表的默认字符集与排序规则是utf8mb4与utf8mb4_0900_ai_ci,查询时数据是不区分大小写的,如果需要区分大小写则可以在查询时指定BINARY关键字,此时MySQL会按照二进制方式进行比较,这意味着大小写敏感。如下MySQL示例所示。
CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); INSERT INTO test_table (name) VALUES ('John Doe'); INSERT INTO test_table (name) VALUES ('john doe'); -- 区分大小写查找 SELECT * FROM test_table WHERE BINARY name = 'John Doe'; -- 不区分大小写查找 SELECT * FROM test_table WHERE name = 'John Doe';
改造建议
在GaussDB中,默认情况下,查询是大小写敏感的,这与MySQL的BINARY关键字效果一致,但是与MySQL默认行为不一致。
如果需要保持大小写的默认行为与MySQL一致,有如下两种方案:
1、GaussDB 集中式版V2.0-8.0版本开始支持M兼容数据库,大小写的默认行为与MySQL一致;
2、GaussDB 集中式版B兼容模式或者分布式版MYSQL兼容模式的数据库,需要在创建时指定UTF8编码,并设置GUC参数b_format_dev_version = 's1'; b_format_version = '5.7';,此时数据库中大小写的默认行为与MySQL一致。
注意:b_format_dev_version = 's1';时,只有表数据查询的大小写与MySQL保持一致,但是常量字符串匹配还是区分大小写的。GaussDB V2.0-8.100时b_format_dev_version支持s2,此时常量字符串比较也不区分大小写了。更多详情请参考《GaussDB开发者指南》。
UGO不转换BINARY关键字,如上所述,数据库查询是否区分大小写与GaussDB数据库的设置有关,建议您迁移前准备时做好充分的评估与配置。如果仅需要在单条查询上区分大小写,指定一个区分大小写的排序规则即可。例如如下语句等价于MySQL的BINARY特性:
SELECT * FROM test_table WHERE name = 'John Doe' COLLATE utf8mb4_bin;
