以前没有关注MySQL,最近用的时候才发现,除了表的名称要注意大小写,实际存储的字段值也是要注意的。
===== 这个表是不区分的
create table XX (
ID INT(11) NOT NULL auto_increment,
TXTVAL VARCHAR(256) NOT NULL,
primary key (ID)
);
==== 这个表因为有UK,所以区分
create table XXX (
ID INT(11) NOT NULL auto_increment,
TXTVAL VARCHAR(128) NOT NULL,
primary key (ID),
unique key XXX (TXTVAL)
);
insert into XX(TXTVAL) values('ab');
insert into XX(TXTVAL) values('Ab');
commit;
mysql> select * from XX;
+----+--------+
| ID | TXTVAL |
+----+--------+
| 1 | ab |
| 2 | Ab |
+----+--------+
2 rows in set (0.00 sec)
mysql>
mysql> select * from XX where TXTVAL = 'ab';
+----+--------+
| ID | TXTVAL |
+----+--------+
| 1 | ab |
| 2 | Ab |
+----+--------+
2 rows in set (0.00 sec)
mysql>
mysql> insert into XXX(TXTVAL) values('ab');
Query OK, 1 row affected (0.08 sec)
mysql> insert into XXX(TXTVAL) values('Ab');
ERROR 1062 (23000): Duplicate entry 'Ab' for key 'XXX'
mysql>
mysql> select * from XXX where TXTVAL = 'ab';
+----+--------+
| ID | TXTVAL |
+----+--------+
| 1 | ab |
+----+--------+
1 row in set (0.00 sec)
mysql>
===== 这个表区分,因为用了“”关键字
create table YY (
ID INT(11) NOT NULL auto_increment,
TXTVAL VARCHAR(256) BINARY NOT NULL,
primary key (ID)
);
create table YYY (
ID INT(11) NOT NULL auto_increment,
TXTVAL VARCHAR(128) BINARY NOT NULL,
primary key (ID),
unique key YYY (TXTVAL)
);
insert into YY(TXTVAL) values('ab');
insert into YY(TXTVAL) values('Ab');
commit;
select * from XXX where TXTVAL = 'ab';
select * from YYY where TXTVAL = 'ab';
select * from YYY;
mysql> select * from YY where TXTVAL = 'ab';
+----+--------+
| ID | TXTVAL |
+----+--------+
| 1 | ab |
+----+--------+
1 row in set (0.00 sec)
mysql>
mysql> select * from YYY where TXTVAL = 'ab';
+----+--------+
| ID | TXTVAL |
+----+--------+
| 1 | ab |
+----+--------+
1 row in set (0.00 sec)
mysql>
下面是在网上看到的文章,原址如下:
http://zhangzuanqian.iteye.com/blog/210456
MySQL查询字符串时大小写不敏感
最近反映如果注册了阿龙。阿磊就不能注册的问题!这个是mysql问题!很多用mysql的论坛都有这个问题。而且不仅仅是这两个词的问题。
出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,这个字符集对大小写不敏感,因此在比较过程中中文编码字符大小写转换造成了这种现象。
方法一:
解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。
方法二:
如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。
方法三:
可以使用 Mysql 的 locate 函数来判断。以上述问题为例,使用方法为:
SELECT * FROM table WHERE locate(field,'李') > 0;
方法四:
把您的Select语句改成这样,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可!
方法五:
如果你在Windows下使用已经编译好的MySQL,可以修改My.ini中的字符集选项。
default-character-set = gb2312
在默认情况下,mysql搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE 'a%'进行搜索,你将获得以A或a开始的所有列。
如果打算使搜索区分大小写,请确保操作数之一具有区分大小写的或二进制校对。例如,如果你正在比较均适用latin1字符集的列和字符串,可使用COLLATE操作符,使1个操作数具有latin1_general_cs或latin1_bin校对特性。例如:
col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin
如果希望总是以区分大小写的方式处理列,可使用区分大小写的或二进制校对声明它。建表时候使用BINARY标示。
CREATE TABLE T(
A VARCHAR(10) BINARY
);
如果是自己的服务器使用win系统,方法五是最好的方法!如果是linux系统,可以使用方法二!如果不是自己的机子,可以使用方法一,这样你的用户名是严格区分大小写的!
还有一篇,原址如下:
http://mtnt2008.iteye.com/blog/766135
MySQL大小写问题
MySQL的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 ;如下面
- insert into t values('A');
- insert into t values('a');
当第二条执行的时候,如果是主键或者有唯一性约束的话,会发生
- Duplicate entry for XXX
更加迷惑的是下面的2条语句
- insert into t values('~');
- insert into t values('y');
也会发生插入错误。
在查询的时候也会出现这样的问题
- /* 查询的结果一眼 */
- select * from t where a like 'a%'
- select * from t where a like 'A%'
- /* 下面的查询结果也是一样 */
- select * from t where a = 'y';
- select * from t where a = ''~;
1.问题产生的原因
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;
2.解决办法
A.表名区分大小写
在my.conf加入:
ower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写
B.插入查询时区分大小写
字段值需要设置BINARY属性,即可区分大小写。
设置的方法有多种:
创建时设置:
CREATE TABLE T(
A VARCHAR(10) BINARY
);
ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;