mysql大小写敏感问题

问题:

在开发项目过程中发现一个问题,不同的终端操作同一个订单报错。经过排查发现是因为在移动端单号中的字母是小写的,到了PC端限制了单号只能是大写。

举例说明:

单号为test的订单在移动端创建。在PC端前段控制文本输入框只能输入大写,即便是小写输入前段会自动转换为大写。所以PC端输入TEST调后台查询,可以查询出数据库中单号为test的数据,但是在继续操作的时候,java代码中使用orderDto.getOrderId.equals(origOrder.getOrderId)进行比较前端输入的单号和数据库中的单号是否一致。因为前端输入的是大写,数据库中是小写,所以会返回报错。

解决办法:

因为从业务上讲我们的单号是不区分大小写的,所以后台使用equalsIgnoreCase作比较,不区分大小写比较。

           另外,可以通过修改表或字段的字符集,修改为utf8_bin,则数据库区分大小写:

修改表的编码: ALTER TABLE `tableName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

修改字段的编码: ALTER TABLE `tableName` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 

原因分析:

mysql数据库字段值不区分大小写,所以可以查询出来。字段值的大小写由Mysql的collate来控制。提到collate,就不得不说字符集。字符集是一套符号和编码,collate是在字符集内用于比较字符的一套规则,比如定义'A'<'B'这样的关系的规则。不同的字符集有多种校对规则,一般而言,collate以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 。

 

比如 utf8字符集:
utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的collate;
utf8_general_cs表示区分大小写,
utf8_bin表示二进制比较,同样也区分大小写。

查询数据库表collate字符集show variables like '%collation%':

查询表字段的字符集:show full columns from logistics.order。都是utf8_general_ci,不区分大小写的。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页