更改MYSQL資料庫不區分大小寫

weixin_33766168發表於2016-02-24
今天鬱悶死了,在LINUX下調一個程式老說找不到表,但是我明明是建了表的,在MYSQL的命令列下也可以查到,為什麼程式就找不到表呢?

  後來請教了一個老師才搞定,原來是LINUX下的MYSQL預設是要區分表名大小寫的,哎,弄了那麼舊,害死我了。

  讓MYSQL不區分表名大小寫的方法其實很簡單:

  1.用ROOT登入,修改/etc/my.cnf

  2.在[mysqld]下加入一行:lower_case_table_names=1

  3.重新啟動資料庫即可。



1、Linux下mysql安裝完後是預設:區分表名的大小寫,不區分列名的大小寫;
2、用root帳號登入後,在/etc/my.cnf中的[mysqld]後新增新增lower_case_table_names=1,重啟MYSQL服務,這時已設定成功:不區分表名的大小寫;
lower_case_table_names引數詳解:
lower_case_table_names=0
其中0:區分大小寫,1:不區分大小寫

MySQL在Linux下資料庫名、表名、列名、別名大小寫規則是這樣的:
1、資料庫名與表名是嚴格區分大小寫的;
2、表的別名是嚴格區分大小寫的;
3、列名與列的別名在所有的情況下均是忽略大小寫的;
4、變數名也是嚴格區分大小寫的;
MySQL在Windows下都不區分大小寫。



mysql預設是對字母的大小寫不區分的

mysql> create table t1(
-> username varchar(10));
Query OK, 0 rows affected (0.09 sec)

mysql> insert into t1 values('you'),('You'),('YOU');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
對這個表,預設情況下,下面兩個查詢的結果是一樣的:


mysql> select * from t1 where username = 'you';
+------+
| username |
+------+
| you |
| You |
| YOU |
+------+
3 rows in set (0.00 sec)

mysql> select * from t1 where username = 'YOU';
+------+
| username |
+------+
| you |
| You |
| YOU |
+------+
3 rows in set (0.00 sec)
如果想讓MYSQL知道你輸入的字母是大寫還是小寫的,修改表:

mysql> alter table t1 change username username varchar(10) binary;
Query OK, 3 rows affected (0.20 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1 where username = 'you';
+------+
| username |
+------+
| you |
+------+
1 row in set (0.00 sec)

mysql> select * from t1 where username = 'YOU';
+------+
| username |
+------+
| YOU |
+------+
1 row in set (0.00 sec)
如果你只是想在SQL語句中實現的話:

mysql> select * from t1 where username = binary 'YOU';
+------+
| username |
+------+
| YOU |
+------+
1 row in set (0.02 sec)

mysql> select * from t1 where username = binary 'you';
+------+
| username |
+------+
| you |
+------+
1 row in set (0.00 sec)

如果不想這麼麻煩而想服務一開啟就讓大小寫一致的話:
可以修改my.ini或者my.cnf
[mysqld]
lower_case_table_names=1
(0:區分;1:不區分)
然後重啟MYSQL服務。

mysql> show variables like '%case_table%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
1 row in set (0.00 sec)
注:WINDOWS系統不用修改,系統預設就是1
LINUX 系統預設是0。因為LINUX下的指令碼都是區分大小寫的。


Windows 環境下大小寫不敏感

CREATE TABLE tab (
 id INT AUTO_INCREMENT,
 val VARCHAR(10),
 PRIMARY KEY (id)
);

mysql> select * from tab;
Empty set (0.00 sec)

mysql> select * from Tab;
Empty set (0.00 sec)

mysql> select * from `Tab`;
Empty set (0.00 sec)

在MySQL中如何在硬碟上儲存和使用表名和資料庫名由lower_case_tables_name系統變數確定,可以在啟動mysqld時設定。lower_case_tables_name可以採用下面的任一值:
含義
0 使用CREATE TABLE或CREATE DATABASE語句指定的大寫和小寫在硬碟上儲存表名和資料庫名。名稱比較對大小寫敏感。在Unix系統中的預設設定即如此。請注意如果在大小寫不敏感的檔案系統上用--lower-case-table-names=0強制設為0,並且使用不同的大小寫訪問MyISAM表名,會導致索引破壞。
1 表名在硬碟上以小寫儲存,名稱比較對大小寫敏感。MySQL將所有表名轉換為小寫以便儲存和查詢。該行為也適合資料庫名和表的別名。該值為Windows和Mac OS X系統中的預設值。
2 表名和資料庫名在硬碟上使用CREATE TABLE或CREATE DATABASE語句指定的大小寫進行儲存,但MySQL將它們轉換為小寫以便查詢。名稱比較對大小寫敏感。註釋:只在對大小寫不敏感的檔案系統上適用! InnoDB表名以小寫儲存,例如lower_case_tables_name=1。
在Windows和Mac OS X中,lower_case_tables_name的 預設值是1。
如果只在一個平臺上使用MySQL,通常不需要更改lower_case_tables_name變數。然而,如果你想要在對大小寫敏感不同的檔案系統的平臺之間轉移表,會遇到困難。例如,在Unix中,my_tables和MY_tables是兩個不同的表,但在Windows中,這兩個表名相同。要想避免由於資料庫或表名的大小寫造成的資料轉移問題,可使用兩個選項:
     在任何系統中可以使用lower_case_tables_name=1。使用該選項的不利之處是當使用SHOW TABLES或SHOW DATABASES時,看不出名字原來是用大寫還是小寫。
     在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。這樣了可以保留資料庫名和表名的大小寫。不利之處是必須確保在Windows中查詢總是用正確大小寫引用資料庫名和表名。如果將查詢轉移到Unix中,由於在Unix中大小寫很重要,如果大小寫不正確,它們不工作。
例外:如果你正使用InnoDB表,在任何平臺上均應將lower_case_tables_name設定為1,以強制將名轉換為小寫。
請注意在Unix中將lower_case_tables_name設定為1之前,重啟mysqld之前,必須先將舊的資料庫名和表名轉換為小寫。
用慣了windows下面的不區分大小寫的mysql語句,到了linux下面還真的很多不習慣。
在MySQL 中,資料庫和表對就於那些目錄下的目錄和檔案。因而,作業系統的敏感性決定資料庫和表命名的大小寫敏感。這就意味著資料庫和表名在 Windows 中是大小寫不敏感的,而在大多數型別的 Unix 系統中是大小寫敏感的。
奇怪的是列名與列的別名在所有的情況下均是忽略大小寫的,而表的別名又是區分大小寫的。
要避免這個問題,你最好在定義資料庫命名規則的時候就全部採用小寫字母加下劃線的組合,而不使用任何的大寫字母。
或者也可以強制以 -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下所有的大寫字元都變成小寫了)。
即:unix下面預設是區分大小寫的,而winodws下面是不區分的。為了設定unix下面不區分大小寫,要設定unix下面的資料庫表名都是小寫的,並在配置檔案my.conf上面,的mysqld欄位增加lower_case_table_name=1,1為不區分大小寫,0是區分大小寫。。。並/etc/init.d/mysql restart即可。。。

Linux下mysql安裝完後是預設:區分表名的大小寫,不區分列名的大小寫;2、用root帳號登入後,在/etc/my.cnf 中的[mysqld]後新增新增lower_case_table_names=1,重啟MYSQL服務,這時已設定成功:不區分表名的大小 寫;lower_case_table_names引數詳解:lower_case_table_names = 0其中 0:區分大小寫,1:不區分大小寫MySQL在Linux下資料庫名、表名、列名、別名大小寫規則是這樣的:1、資料庫名與表名是嚴格區分大小寫的;2、 表的別名是嚴格區分大小寫的;3、列名與列的別名在所有的情況下均是忽略大小寫的;4、變數名也是嚴格區分大小寫的;MySQL在Windows下都不區 分大小寫。3、如果想在查詢時區分欄位值的大小寫,則:欄位值需要設定BINARY屬性,設定的方法有多種:A、建立時設定:CREATE TABLE T(A VARCHAR(10) BINARY);B、使用alter修改:ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;C、mysql table editor中直接勾選BINARY項。

相關文章