MySQL的大小寫問題 不是一個很大的問題,但是如果不了解的話,卻會使用戶產生迷惑 ;如下面
Sql代碼
insert into t values('A');
insert into t values('a');
當第二條執行的時候,如果是主鍵或者有唯一性約束的話,會發生
Sql代碼
Duplicate entry for XXX
更加迷惑的是下面的2條語句
Java代碼
insert into t values('~');
insert into t values('y');
也會發生插入錯誤。
在查詢的時候也會出現這樣的問題
Java代碼
/* 查詢的結果一眼 */
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、變量名也是嚴格區分大小寫的;
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項。
oracle中分為兩種情況,單純的sql語句不區分大小寫,但是如果查詢某個字符的話就需要區分大小寫。
1、如以下情況,是不區分大小寫的,查詢結果都是一致的:
select
*
from
emp;
SELECT
*
FROM
EMP;
|
2、如在emp表中查詢ename為“SMITH”(不含引號)的信息,就必須注意大小寫:
select
*
from
emp
where
ename=
'SMITH'
;
|
這樣是有結果的,如圖:
select
*
from
emp
where
ename=
'smith'
;
|
這樣則查詢不出結果: