注册
登录

您现在的位置是:首页 > 学无止境

Mysql的大小写敏感性

木木彡82 2009-02-24 09:42:00 6211人围观
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE T1( NAME VARCHAR(10) ); 对这个表,缺省情况下,下面两个查询的结果是一样的:SELECT * FROM T1 WHERE A=AB...

MYSQL在默认的情况下查询是不区分大小写的,例如:

CREATE TABLE T1(
NAME VARCHAR(10)
);

对这个表,缺省情况下,下面两个查询的结果是一样的:

SELECT * FROM T1 WHERE A=''ABC'';
SELECT * FROM T1 WHERE A=''Abc'';


也就是说不区分大小写,而在数据库设计的时候,可能需要大小写敏感,解决方法是建表时候使用BINARY标示。

CREATE TABLE T1(
NAME VARCHAR(10) BINARY
);

或者使用BINARY关键字:

SELECT * FROM T1 WHERE A=BINARY ''ABC'';
SELECT * FROM T1 WHERE A LIKE BINARY ''%Abc%'';

另外,在 MySQL 中,数据库和表对应于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。
尽管在 Windows 中数据库与表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。下面的查询将不能工作,因为它以 my_table 和 MY_TABLE 引用一个表:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
列名与列的别名在所有的情况下均是忽略大小写的。
表的别名是区分大小写的。下面的查询将不能工作,因为它用 a 和 A 引用别名:

mysql> SELECT col_name FROM tbl_name AS a WHERE a.col_name = 1 OR A.col_name = 2;
(但是,在我的mysql5.0.x里面:
SELECT * FROM uab_corp_userinfo AS UCU where ucu.LOGINUSERID = ''CAiBoWeiAAB@myce.net.cn'' AND UCU.CORPIID=2 ;
是可以正确运行的。可能是在windows下的原因吧。)

如果记忆数据库和表名的字母大小写有困难,建议采用一个一致一约定,例如总是以小写字母创建数据库和表。

避免这个问题的另一个办法就是以 -O lower_case_table_names=1 参数启动 mysqld。缺省地在 Windows 中这个选项为 1 ,在 Unix 中为 0。如 果 lower_case_table_names 为 1 ,MySQL 将在存储与查找时将所有的表名转换为小写字线。(从 MySQL 4.0.2 开始,这个选项同样适用于数据库名。) 注意,当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。
也可以通过在MySQL的配置文件my.ini中增加一行:
lower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写

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

  1、数据库名与表名是严格区分大小写的;

  2、表的别名是严格区分大小写的;

  3、列名与列的别名在所有的情况下均是忽略大小写的;

  4、变量名也是严格区分大小写的;

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

文章评论

  • 登录后评论

点击排行