MySQL的大小写

以前没有关注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的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 ;如下面

 

Sql代码    收藏代码
  1. insert into t values('A');  
  2.   
  3. insert into t values('a');  

 

当第二条执行的时候,如果是主键或者有唯一性约束的话,会发生

 

Sql代码    收藏代码
  1. Duplicate entry for XXX  

 

更加迷惑的是下面的2条语句

 

Java代码    收藏代码
  1. insert into t values('~');  
  2.   
  3. insert into t values('y');  

 

也会发生插入错误。

 

在查询的时候也会出现这样的问题

 

Java代码    收藏代码
  1. /* 查询的结果一眼 */  
  2. select * from t where a like 'a%'  
  3. select * from t where a like 'A%'  
  4.   
  5. /* 下面的查询结果也是一样 */  
  6. select * from t where a = 'y';  
  7. select * from t where a = ''~;  

 

1.问题产生的原因

 

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:


1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;

 

MySQL在Windows下都不区分大小写。

MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,这个字符集对大小写不敏感,因此在比较过程中中文编码字符大小写转换造成了这种现象。

 

 

2.解决办法

 

A.表名区分大小写

 

在my.conf加入:

ower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写

 

B.插入查询时区分大小写

 

字段值需要设置BINARY属性,即可区分大小写。

 

设置的方法有多种:

创建时设置: 
CREATE TABLE T( 
A VARCHAR(10) BINARY 
);

 

使用alter修改:  
ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;

mysql table editor中直接勾选BINARY项。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值