MySQL字段值大小写敏感的解决方案

34 篇文章 3 订阅
6 篇文章 0 订阅

最近在用开源的MySQL 8.0开发本公司的产品,在客户现场建表时默认使用的是CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 字符集导致与oracle的结果不一致,最后将建表时的字符集改为utf8mb3就可以了。

正常建表如下,默认使用的是CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 字符集

[test]> CREATE TABLE t3(id int primary key, name varchar(50))engine = xxx;
Query OK, 0 rows affected (0.07 sec)

[test]> insert into t3 values(1, '123AA123'), (2, '123aa123');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

[test]> show create table t3;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                   |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t3    | CREATE TABLE "t3" (
  "id" int NOT NULL,
  "name" varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY ("id")
) ENGINE=xxx DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

[test]> select * from t3 where name = "123AA123";
+----+----------+
| id | name     |
+----+----------+
|  1 | 123AA123 |
|  2 | 123aa123 |
+----+----------+
2 rows in set (0.00 sec)

上面的结果导致查询有2条记录,也就是大小写不敏感,跟oracle结果不一致,oracle就一条结果。

后面经过排查要与oracle结果一致,将建表时的字符集改为utf8mb3就可以了。因为字符集utf8mb3对大小写是敏感的。

[test]> CREATE TABLE t4(id int primary key, name varchar(50))engine = xxx collate utf8_bin;
Query OK, 0 rows affected, 1 warning (0.08 sec)

[test]> show warnings;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                   |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Error | 1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'warning' at line 1 |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

[test]> select * from t4 where name = '123aa123';
+----+----------+
| id | name     |
+----+----------+
|  2 | 123aa123 |
+----+----------+
1 row in set (0.01 sec)

[test]> select * from t4 where name = '123AA123';
+----+----------+
| id | name     |
+----+----------+
|  1 | 123AA123 |
+----+----------+
1 row in set (0.00 sec)

但是这样导致建表时会有警告,字符集这块相当于从utf8mb4 退化到了 utf8mb3了。

还有一种方法就是建表时,默认使用utf8mb4字符集,但是建表之后立即执行:

alter table test3 modify name varchar(50) collate utf8_bin;将name列的字符集改为utf8_bin。

总结:建表时指定的字符集导致大小写不敏感导致的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值