我爱人做测试工作,遇到问题问我说她们测试时候要求不区分大小写,比如M1和m1都显示。我第一反应需求不合理啊。数据库一般来说都是等值比较的。否则就要去做一些工作了。我就展开了一个实验场景,给她看看。实验场景是Oracle19C,效果如下:
精确查询a1的时候返回a1,模糊查询的时候没有A1。这是我预期的。
但是她说她们系统不区分的。我想到她们系统是MySQL的,理论上MySQL也应该这样才是。
于是来一个MySQL的,MySQL8.0.29
这个结果说实在的有点让我吃惊。显然MySQL是没有区分。
那么我自然想到了兼容MySQL的TiDB是怎么做的呢?
在Tidb下会不会也继承呢?
在tidb5.3的场景下,也是查询区分大小写的。
其实说模糊查询,其实不准确,应该说查询即使精确查询都是区分大小写的。TiDB并没有继承MySQL的优化器和执行器,而是采用类似Oracle的方式来做判断和执行。
那么是MySQL错了吗?其实我倒是觉得这个可能要分场景,真的没有对错。Oracle、TiDB如实反馈没有错。如果这个时候有个需求说要不区分怎么办?通常程序会改 小写 or 大写。即应用程序分别匹配一下。而MySQL就不用改了。
但是如果需求说就是要如实反馈,区分呢?显然MySQL默认下是不行了,有没有办法改呢?
有的。这样就可以了。所以说没有对错吧。大家在使用两者的时候注意一下这个区别。
最终我其实想表达的是:我只是说默认的rpm安装没有指定。当然在字符集设置上也可以指定,带bin的可以。否则要显示指定。
但是这点上TiDB都是在默认设置上采用了区分。我主要目的是为了是让一些从MySQL迁移过来的朋友有个注意。否则可能觉得遇到了问题或者bug,而其实不是这样的。因为毕竟我就遇到了。