数据类型
二进制方式比较字符串
如何在 CHAR、VARCHAR、TEXT 类型的字符串比较时严格区分大小写?
方式 1:使用 BINARY 关键字:
① 直接测试比较结果
SELECT 'a ' = 'A'; # 比较结果:1(相等)
SELECT BINARY 'a' = 'A', 'a' = BINARY 'A'; # 比较结果:0(不相等)
SELECT BINARY 'A ' = 'A'; # 比较结果:0(不相等)
SELECT BINARY 'A' = 'A', 'A' = BINARY 'A'; # 比较结果:1(相等)
在字段名或某个值的前面加上 BINARY 转换为二进制
② 在查询条件中进行二进制比较
CREATE TABLE my_char (c CHAR(2));
INSERT INTO my_char VALUES('A');
SELECT c FROM my_char WHERE c = 'a '; # 查询结果为“A”
SELECT c FROM my_char WHERE BINARY c = 'a'; # 查询结果为空
SELECT c FROM my_char WHERE BINARY c = 'A '; # 查询结果为空
SELECT c FROM my_char WHERE BINARY c = 'A'; # 查询结果为“A”
方式 2:设置字段的校对集
更改校对集实现区分大小写:
latin1:latin1_bin
gbk:gbk_bin
utf8:utf8_bin
① 创建表时设置字段的校对集
CREATE TABLE my_char (
c1 CHAR(2) CHARACTER SET latin1 COLLATE latin1_bin,
c2 CHAR(2) CHARACTER SET gbk COLLATE gbk_bin,
c3 CHAR(2) CHARACTER SET utf8 COLLATE utf8_bin
);
② 插入测试数据
INSERT INTO my_char VALUES('A', 'A', 'A');
③ 查询测试
SELECT c1 = 'a', c2 = 'a', c3 = 'a' FROM my_char; # 结果:0(不相等)
SELECT c1 = 'A', c2 = 'A', c3 = 'A' FROM my_char; # 结果:1(相等)
SELECT c1 = 'A ',c2 = 'A ',c3 = 'A ' FROM my_char; # 结果:1(相等)
在比较时仍会忽略字符串末尾的空格
ENUM 使用示例
① 创建表
mysql> CREATE TABLE my_enum (gender ENUM('male', 'female'));
② 插入两条测试记录
mysql> INSERT INTO my_enum VALUES('male'), ('female');
③ 查询记录,查询结果为“female”
mysql> SELECT * FROM my_enum WHERE gender = 'female';
④ 插入枚举列表中没有的值测试
mysql> INSERT INTO my_enum VALUES('m');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
SET 类型:保存字符串对象
SET('值 1', '值 2', '值 3', …, '值 n')
SET 与 ENUM 的区别:
它可以从列表中选择一个或多个值来保存,多个值之间用逗号“,”分隔。
SET 使用示例
① 创建表
mysql> CREATE TABLE my_set (hobby SET('book', 'game', 'code'));
② 插入 3 条测试记录
mysql> INSERT INTO my_set VALUES(''), ('book'), ('book,code');
③ 查询记录,查询结果为“book,code”
mysql> SELECT * FROM my_set WHERE hobby = 'book,code';
收尾!
版权声明: 本文为 InfoQ 作者【在即】的原创文章。
原文链接:【http://xie.infoq.cn/article/e0a0829c3b697b348cf03e4a6】。文章转载请联系作者。
评论