mysql字段值默认不分大小写

394 阅读2分钟

问题描述

导入或输入内容进行查询时,如:身份证号比对校验,身份证最后一位为x,mysql数据库存储为X,先根据身份证号进行查询,可以查到数据库中存储的身份证号,在java代码中进行比较为false。但是从业务角度来说,这就是同一个身份证号,应该为true。

// mysql大小写查询结果是一样的
select * from user where id_card = '123456789x';
select * from user where id_card = '123456789X';
// 代码中比较为false
"123456789x".equals("123456789X") = false

解决方法

代码处理

1.将导入或输入的数据进行字母转换,将所有字母都转换成大写字母。

2.将数据库中查询出来的数据也进行大写字母转换(历史数据原因,数据库获取到的内容也做大写转换。后期应控制入库的数据都为大写字母)。

3.需要注意的是身份证最后一位除了大小写输入习惯 还有希腊数字"X"表示10。将希腊数字在代码中进行特殊处理,识别ascii码(8553 || 8569)转换成大写字母“X”。

mysql处理

-- 1.使用 BINARY 每次查询都要带着
select * from user where BINARY id_card ='123456789x';

-- 2使用 BINARY 在创建字段时限制
CREATE TABLE `tb_user1` ( 
    `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', 
    `id_card` VARCHAR (20) BINARY NOT NULL COMMENT '身份证号', 
     PRIMARY KEY (`id`) 
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表';


-- 3在创建字段或者建表时 在字段上或者表上添加COLLATE=utf8_bin 字符集限制
   摘自:https://juejin.cn/post/6844903870582243335
CREATE TABLE `user` ( 
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id', 
`id_card` varchar(20) COLLATE utf8_bin NOT NULL COMMENT '身份证号', 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表'

utf8字符集:
1)utf8_bin:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
2)utf8_general_ci:utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
3)utf8_general_cs:utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

扩展

mysql大小写敏感配置相关的两个参数, 系统文件:lower_case_file_system  表名:lower_case_table_names