Linux下部署MySQL,大小寫敏感踩坑記錄


今天在將開發環境中的門戶數據庫復制到新環境后,使用SqlSugar的ORM框架進行數據庫操作的時候,出現了主鍵找不到的現象。排查了很久終於發現了關鍵點。特此記錄。

1.開發環境:
    操作系統:CENTOS7 64位
    內存:    1GB
    CPU     1/1
    網絡適配器:網橋模式
    安裝模式:最小化安裝
    系統語言設置:zh_CN.gb2312
    
    數據庫版本:MySQL 5.6.29 binary 模式安裝
    建立數據庫之前:my.cnf參數配置
        character-set-server = utf8
        log-bin=mysql-bin
        skip-name-resolve
        lower_case_table_names = 0  #之后可能設置過1的現象
    開發數據庫實例名稱:GoodMES_P_V0_5
    數據庫實例中表名稱,列名稱 全部大寫
    具體還經過哪些設置暫時不記得了,但是最終的結果是,不論sql語句中表名稱大小寫,都能查到數據。根據推測,數據庫大小寫也都能認識。對數據庫的操作是DOS.ORM
    
2.這次的部署環境:
    操作系統:CENTOS7 64位
    內存:    1GB
    CPU     1/1
    網絡適配器:網橋模式
    安裝模式:最小化安裝
    系統語言設置:zh_CN.UTF-8
    
    數據庫版本:MySQL 5.6.29 binary 模式安裝
    數據庫實例名稱:G_START
    數據庫實例中表名稱,列名稱 全部大寫
    
    使用SqlSugar的ORM框架進行數據庫操作的時候,出現了主鍵找不到的現象。通過記錄mysql日志信息,得到數據庫操作記錄信息,發現SqlSugar的ORM框架對數據庫的操作之前,必然都會將實體名稱,表名稱,列名稱全部轉換成大小寫。然而由於mysql默認設置的是大小寫敏感,故而找不到主鍵信息。同時針對需要主鍵信息來進行處理的內容,都會存在問題,因為SQLSugar的InSingle操作或者其他的針對主鍵的操作,都會進行一個獲取主鍵的動作,而這個獲取主鍵的動作是通過
    select DISTINCT TABLE_NAME as tableName,COLUMN_NAME as keyName from INFORMATION_SCHEMA.COLUMNS where table_name='" + tableName + "' AND COLUMN_KEY='PRI'這個SQL語句來獲取的,雖然這里的tableName傳入是正確的是表名稱,但是由於是被轉換成了小寫,所以這里是查不到數據的。從而導致了找不到主鍵的情況(SQLSugar框架的坑還是大部分數據庫操作框架的坑?)。
    查閱網上信息,說可以通過設置lower_case_table_names這個數據庫的參數來進行設置,設置了lower_case_table_names=1(大小寫不敏感)一個更嚴重的問題出現了,因為數據庫實例的名稱也是大寫的。但是SQLsugar同樣的進行了小寫化操作。所以數據庫仍然是找不到的,同樣的mysql客戶端在選擇該數據庫的時候,也出現了數據庫未找到的情況。
    查詢mysql官網,lower_case_table_names有第三個參數:
    0:默認值,大小寫敏感;請注意如果在大小寫不敏感的文件系統上用--lower-case-table-names=0強制設為0,並且使用不同的大小寫訪問MyISAM表名,會導致索引破壞。
    1:表名在硬盤上以小寫保存,名稱對大小寫不敏感。MySQL將所有表名轉換為小寫以便存儲和查找
    2:表名和數據庫名在硬盤上使用CREATE TABLE或CREATE DATABASE語句指定的大小寫進行保存,但MySQL將它們轉換為小寫以便查找。(這個操作需謹慎,因為一旦這樣設置了,那么實際上就變成了表里不一的情況,查找問題就比較難了。)
    很明顯我的目的是否能實現的最終拍板權還是文件系統,無論我怎么設置大小寫敏感還是大小寫不敏感,都無法對數據庫進行操作。區別點在於一個是能連接到數據庫,一個是連數據庫都找不到了。
    所以我的最終結果是:
    1.設置數據庫大小寫不敏感
    2.重新配置一個實例:實例名稱小寫
    3.將開發環境中的數據表導出一份
    4.將表結構導入到部署環境,你會發現導入后的表名都變成了小寫。但是表中的列的名稱仍然是大寫。
    
    結論:在windows下MySQL數據庫中實例,表,列的名稱都是大小寫不區分的,隨意折騰。但是到了類Unix系統,比如Ubuntu,CentOS,那么在部署數據庫之前必須要謹慎考慮,是需要大小寫敏感還是大小寫不敏感。數據庫中實例,表,列名稱的命名是要用大寫的還是小寫的。萬一處理不好,最糟糕的可能就是數據庫重建。耗時耗力,還吃力不討好。
    
    建議:命名全部小寫;建議區分大小寫。一旦設定,則不建議修改數據庫設置。同時在應用時選擇數據庫操作框架的時候,需要謹慎考慮。了解底層對數據庫的操作方式。
   


免責聲明!

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



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