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

來源:互聯網
上載者:User

標籤:系統   and   修改   star   distinct   日誌資訊   注意   建議   from   

今天在將開發環境中的門戶資料庫複寫到新環境後,使用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,那麼在部署資料庫之前必須要謹慎考慮,是需要大小寫敏感還是大小寫不敏感。資料庫中執行個體,表,列名稱的命名是要用大寫的還是小寫。萬一處理不好,最糟糕的可能就是資料庫重建。耗時耗力,還吃力不討好。
    
    建議:命名全部小寫;建議區分大小寫。一旦設定,則不建議修改資料庫設定。同時在應用時選擇資料庫操作架構的時候,需要謹慎考慮。瞭解底層對資料庫的操作方式。
   

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.