2012年9月5日星期三

mysql 大小写敏感问题test


1.设置前test
SELECT * FROM `t_sys_users` where account rlike "^[A-Z]";
SELECT * FROM `t_sys_users` where account rlike "^[a-z]";
效果是一样的,其中关于是使用正则表达的方式
rlike 或 regexp
或者使用SELECT * FROM `t_sys_users` where account like "a%";
[popexizhi补]好吧错大了,嘻嘻,在查询了修改设置项目的说明后发现,是自己的大小写明感理解错的太多了,这里的敏感性只针对表名,字段等内容,数据内容的匹配和这个没有关系的。上面测试的例子应该修改为如下:
SELECT * FROM `t_sys_users` where account rlike "^[a-z]";
SELECT * FROM `t_sys_USERS` where account rlike "^[a-z]";
嘻嘻,测试了一下,.6和local的数据库没有任何的区别,因为.6的/etc/my.cnf 中
[mysqld]
lower_case_table_names=1
而local本地的是windows os 没有写过my.ini 默认为 0 的:)

倒是.8上看到 /etc/my.cnf 看到加过注释的lower_case_table_names=1 嘻嘻,这是当年修改后因为jira加注释的结果了:).

2.[go]修改数据库大小写敏感的设置

其中why敏感性不同【来源:http://tech.techweb.com.cn/thread-222259-1-1.html】

在MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。[popexizhi:这样解释是window目录中大小写不明感]

奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。
要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。" [popexizhi:别名和列名永远是忽略大小写,why?]

或者也可以强制以 -O lower_case_table_names=1 参数启动 mysqld(如果使用 --defaults-file=...\my.cnf 参数来读取指定的配置文件启动 mysqld 的话,你需要在配置文件的 [mysqld] 区段下增加一行 lower_case_table_names=1)。这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符(这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名)。

当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。
换句话说,如果你希望在数据库里面创建表的时候保留大小写字符状态,则应该把这个参数置0: lower_case_table_names=1 。否则的话你会发现同样的sqldump脚本在不同的操作系统下最终导入的结果不一样(在Windows下所有的大写字符都变成小写了)。[popexizhi:这个可以强制指定,不过只能修改之后操作的,对旧数据无可奈何:)]

修改内容参考:http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#name-case-sensitivity [9.2.2. 识别符大小写敏感性]

设置[mysqld]中
lower_case_tables_name=1 为不敏感大小写
lower_case_tables_name=0 为敏感大小写

linux 为/etc/my.cnf
window 为my.ini

-----------------------------------------------
注释:尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as MY_tables:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。

默认情况,表别名在Unix中对大小写敏感,但在Windows或Mac OS X中对大小写不敏感。下面的查询在Unix中不会工作,因为它同时引用了别名a和A:

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;
然而,该查询在Windows中是可以的。要想避免出现差别,最好采用一致的转换,例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换。
------------------------------------------------

3.
[?]
修改local
lower_case_table_names=0
重启mysqld后,查询还是不区分大小写why?



没有评论:

发表评论