一、mysql配置文件控制
mysql是通過lower_case_table_names參數(shù)來控制大小寫敏感的,該參數(shù)在[mysqld]結(jié)點下。
https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html
表和數(shù)據(jù)庫名稱在磁盤上的存儲方式以及在 MySQL 中的使用方式受lower_case_table_names
系統(tǒng)變量的影響 。 lower_case_table_names
可以取下表所示的值。這個變量不 不影響觸發(fā)標(biāo)識符的情況下的靈敏度。在 Unix 上,默認(rèn)值為 lower_case_table_names
0。在 Windows 上,默認(rèn)值為 1。在 macOS 上,默認(rèn)值為 2。
lower_case_table_names
只能在初始化服務(wù)器時配置。lower_case_table_names
禁止在服務(wù)器初始化后更改 設(shè)置。
價值 | 意義 |
---|---|
0 |
表和數(shù)據(jù)庫名稱使用CREATE TABLE orCREATE DATABASE 語句中指定的字母大小寫存儲在磁盤上。名稱比較區(qū)分大小寫。你應(yīng)該不會,如果你有不區(qū)分大小寫的文件名(如Windows或Mac系統(tǒng))的系統(tǒng)上運行MySQL這個變量設(shè)置為0。如果--lower-case-table-names=0 在不區(qū)分大小寫的文件系統(tǒng)上將此變量強制為 0 并MyISAM 使用不同的字母訪問 表名,則可能會導(dǎo)致索引損壞。 |
1 |
表名以小寫形式存儲在磁盤上,名稱比較不區(qū)分大小寫。MySQL 在存儲和查找時將所有表名轉(zhuǎn)換為小寫。此行為也適用于數(shù)據(jù)庫名稱和表別名。 |
2 |
表和數(shù)據(jù)庫名稱使用CREATE TABLE orCREATE DATABASE 語句中指定的字母存儲在磁盤上,但 MySQL 在查找時將它們轉(zhuǎn)換為小寫。名稱比較不區(qū)分大小寫。這僅適用于不區(qū)分大小寫的文件系統(tǒng)! InnoDB 表名和視圖名以小寫形式存儲,如 lower_case_table_names=1 . |
如果您僅在一個平臺上使用 MySQL,則通常不必使用 lower_case_table_names
默認(rèn)設(shè)置以外的設(shè)置。但是,如果要在文件系統(tǒng)區(qū)分大小寫不同的平臺之間傳輸表,可能會遇到困難。例如,在 Unix 上,您可以有兩個名為my_table
and 的 不同表MY_TABLE
,但在 Windows 上,這兩個名稱被認(rèn)為是相同的。為避免因數(shù)據(jù)庫或表名的字母大小寫引起的數(shù)據(jù)傳輸問題,您有兩種選擇:
-
lower_case_table_names=1
在所有系統(tǒng)上 使用。這樣做的主要缺點是當(dāng)您使用SHOW TABLES
或 時SHOW DATABASES
,您看不到原始字母中的名稱。 -
使用
lower_case_table_names=0
在Unix和lower_case_table_names=2
Windows上。這保留了數(shù)據(jù)庫和表名的字母大小寫。這樣做的缺點是您必須確保您的語句在 Windows 上始終使用正確的字母來引用您的數(shù)據(jù)庫和表名稱。如果你把你的語句轉(zhuǎn)移到 Unix 上,在這種情況下,字母是重要的,如果字母不正確,它們將不起作用。例外:如果您正在使用
InnoDB
表并試圖避免這些數(shù)據(jù)傳輸問題,您應(yīng)該lower_case_table_names=1
在所有平臺上使用強制將名稱轉(zhuǎn)換為小寫。
二、建表或者字段解決方法
1.創(chuàng)建表時,將字段標(biāo)記為binary,二進制大小寫是敏感的
2.在查詢條件的字段前加binary,但是不建議這么做,因為會使字段索引失效
3.建表時設(shè)置校對規(guī)則(collate)
_bin: 表示的是binary case sensitive collation,也就是說是區(qū)分大小寫。
_ci: case insensitive collation,不區(qū)分大小寫 。CREATE TABLE `atest` ( `id` int(11) NOT NULL AUTO_INCREMENT, `url` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `age` int(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 collate uft8_bin;
4.如果建表時校對規(guī)則未用_bin,則可直接修改字段的屬性
alter table test3 modify name varchar(20) collate utf8_bin;
本文摘自 :https://www.cnblogs.com/