MySQL篇-數據校驗規則總結


1、MySQL庫名、表名大小寫驗證規則設置
1.1 MySQL使用lower_case_table_names 該參數設置庫名、表名大小寫驗證規則。lower_case_table_names 取值結果:1/0,配置文件中如果定義該參數值是1,則該參數值=1;如果定義該參數是除1以外的整數,則該參數值=0(非10現有1+N、生產環境的字符集是uft8,lower_case_table_names=1,不允許修改。若需要修改,必須得在新部署環境時單獨修改。 (mysql5.7.27和mysql8.0.15 測試均符合上述內容) 舉例說明: ① lower_case_table_names = 0 庫名、表名存儲為給定的大小寫,比較也是區分大小寫的 ###'數據庫名、表名存儲的時候是區分大小寫的' mysql> create database Test2; Query OK, 1 row affected (0.00 sec) mysql> use Test2; Database changed mysql> create table Test(Id int(10) primary key,Name varchar(20)); Query OK, 0 rows affected (0.06 sec) mysql> show create table Test\G *************************** 1. row *************************** Table: Test Create Table: CREATE TABLE `Test` ( `Id` int(10) NOT NULL, `Name` varchar(20) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.01 sec) mysql> show tables; +-----------------+ | Tables_in_Test2 | +-----------------+ | Test | +-----------------+ mysql> show databases; +------------------------+ | Database | +------------------------+ | information_schema | | Test2 | | mysql | | #mysql50#pages-ibdata1 | | performance_schema | | sys | +------------------------+ 6 rows in set (0.00 sec) ###'數據庫名、表名比較的時候也是區分大小寫的' mysql> use test2; ERROR 1049 (42000): Unknown database 'test2' mysql> use Test2; Database changed mysql> select * from Test; Empty set (0.00 sec) mysql> select * from test; ERROR 1146 (42S02): Table 'Test2.test' does not exist ② lower_case_table_names = 1 庫名、表名在磁盤存儲都是小寫的,參數名和數據存放是區分大小寫的,但是比較的時候不區分大小寫; ###創建數據庫Test5(大小寫混合) mysql> create database Test5; Query OK, 1 row affected (0.01 sec) mysql> show databases; +------------------------+ | Database | +------------------------+ | information_schema | | mysql | | #mysql50#pages-ibdata1 | | performance_schema | | sys | | test5 | +------------------------+ ###使用小寫庫名進入數據庫 mysql> use test5; Database changed ###創建表名(表名,字段名大小寫混合) mysql> create table Test5(id int(10) primary key,Name varchar(20)); Query OK, 0 rows affected (0.06 sec) ###查看庫中的表,庫名表名都是小寫的 mysql> show tables; +-----------------+ | Tables_in_test5 | +-----------------+ | test5 | +-----------------+ ###插入數據使用的表名,字段都是小寫的,數據是大小寫混合的。 mysql> insert into test5(id,name) values(1,'Aaa'); ###查出來的結果,數據和字段顯示都是大小寫混合的 Query OK, 1 row affected (0.03 sec) mysql> select * from test5 where name='aaa'; +----+------+ | id | Name | +----+------+ | 1 | Aaa | +----+------+ 1.2 現有環境(1+N,生產)該參數默認配置都是 1。該參數不能在線修改,mysql8環境搭建成功后不可再次更改,mysql5.7可以重啟數據庫更改 在線更改報錯,mysql5.7可以重啟生效: mysql> set global lower_case_table_names=0; ERROR 1238 (HY000): Variable 'lower_case_table_names' is a read only variable mysql8.0修改參數后重啟失敗,日志報錯,與數據字典不兼容: Data Dictionary initialization failed. 3)MySQL數據大小寫驗證規則 不區分大小寫: 字符集:utf8 默認校驗規則是:utf8_grneral_ci 字符集:gbk 默認校驗規則是:utf8_grneral_ci 字符集:utf8mb4 默認校驗規則是:utf8mb4_grneral_ci 區分大小寫: 字符集:utf8 需設置collate : utf8_bin 字符集:utf8mb4 需設置collate : utf8mb4_bin 字符集:gbk 需設置collate : gbk_bin 區分大小寫的校驗規則適用於 charvarchartext字段 
2、MySQL數據大小驗證規則修改方法
現有1+N、生產環境的庫名、表名、字段名、數據使用時默認不區分大小寫。若要區分大小寫,需要自定義校驗規則,可參考下面的方法修改校驗規則 2.1 數據庫級別的區分大小寫的規則創建與修改 創建 創建數據庫時指定區分大小寫的規則,然后新創建的表默認都是區分大小寫的,但是歷史表還是不區分大小寫 create database test5 character set utf8 collate=utf8_bin; mysql> create database test5 character set utf8 collate=utf8_bin; Query OK, 1 row affected (0.02 sec) mysql> use test5; Database changed mysql> create table test2(name varchar(20)); Query OK, 0 rows affected (0.06 sec) mysql> show create table test2\G *************************** 1. row *************************** Table: test2 Create Table: CREATE TABLE `test2` ( `name` varchar(20) COLLATE utf8_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 1 row in set (0.00 sec) 修改 修改數據庫區分大小寫規則:該庫中歷史表的校驗規則不變,后續新建的表校驗規則是 utf8_bin alter database test character set utf8 collate utf8_bin; 修改數據庫的校驗規則 mysql> alter database test character set utf8 collate utf8_bin; Query OK, 1 row affected (0.89 sec) 歷史表的校驗規則:不區分大小寫 mysql> show create table test\G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(10) NOT NULL, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) 新建表,然后查看新表的校驗規則:創建時未指定。但結果是區分大小寫的 mysql> create table test2(name varchar(20)); Query OK, 0 rows affected (0.32 sec) mysql> show create table test2\G *************************** 1. row *************************** Table: test2 Create Table: CREATE TABLE `test2` ( `name` varchar(20) COLLATE utf8_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 2.2 表級別的區分大小寫的規則創建與修改 創建 mysql> create table test1(id int(10) primary key,name varchar(20)) character set utf8 collate utf8_bin; Query OK, 0 rows affected (0.08 sec) mysql> show create table test1\G *************************** 1. row *************************** Table: test1 Create Table: CREATE TABLE `test1` ( `id` int(10) NOT NULL, `name` varchar(20) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 1 row in set (0.00 sec) 修改 mysql> show create table test2\G *************************** 1. row *************************** Table: test2 Create Table: CREATE TABLE `test2` ( `id` int(10) NOT NULL, `name` varchar(20) COLLATE utf8_bin DEFAULT NULL, `gender` varchar(20) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 1 row in set (0.00 sec) mysql> alter table test2 convert to character set utf8 collate utf8_general_ci; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table test2\G *************************** 1. row *************************** Table: test2 Create Table: CREATE TABLE `test2` ( `id` int(10) NOT NULL, `name` varchar(20) DEFAULT NULL, `gender` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) '指定區分大小寫的修改表的方式根據字符集不同分為兩種':(utf8 = utf8mb3,utf8mb4是utf8mb3的升級版) alter table test3 convert to character set utf8mb4 collate utf8mb4_bin; alter table test3 convert to character set utf8 collate utf8_bin; 2.3 字段級別的區分大小寫的規則創建與修改 創建 mysql> create table test3(id int(10),name varchar(20) binary,gender varchar(20)); Query OK, 0 rows affected (0.06 sec) mysql> show create table test3\G *************************** 1. row *************************** Table: test3 Create Table: CREATE TABLE `test3` ( `id` int(10) DEFAULT NULL, `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `gender` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) 修改 mysql> alter table test3 modify column name varchar(20) binary; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table test3\G *************************** 1. row *************************** Table: test3 Create Table: CREATE TABLE `test3` ( `id` int(10) DEFAULT NULL, `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `gender` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.01 sec) 修改字段方式有兩種,指定區分大小寫:直接指定是binary或者指定collate alter table test3 modify column name varchar(20) character set utf8 collate utf8_bin; alter table test3 modify column name varchar(20) binary; 2.4 歷史數據表,不區分大小寫,但是還需要實現大小寫,可以使用binary 參數實現 mysql> select * from test where name='caps'; +----+------+ | id | name | +----+------+ | 5 | Caps | +----+------+ 1 row in set (0.00 sec) mysql> select * from test where binary name='caps'; Empty set (0.00 sec) 此種場景下,使用binary,無法使用索引 2.5 校驗規則繼承順序 mysql允許在四個級別指定字符集和校對規則:mysql實例,數據庫,表和列。 字段 > 表級別 > 數據庫級別 > mysql實例 創建的表的字段未指定則默認繼承表的校驗規則; 創建的表未指定則默認繼承數據庫的校驗規則; 創建的數據庫未指定時則默認繼承mysql實例的校驗規則。


已創建的表直接修改:alter table test convert to character set utf8mb4 collate utf8mb4_bin;
新建表時設置校驗規則:create table test(id int(10) primary key,name varchar(20)) character set utf8 collate utf8_bin;

庫級別的驗證規則可以改,修改之后,新建的表不設置character時,自動區分大小寫的。
庫級別的修改,如果需要改,我們改一下,alter database test character set utf8 collate utf8_bin;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM