MySQL編碼不一致可能引起的一些問題
儲存過程與編碼
MySQL 儲存過程中,表和資料的編碼與資料庫和儲存過程預設的編碼不同則可能出現 sql 不會使用索引的情況,因為 MySQL 會對條件列的資料做相應的編碼轉換,比如以下,表資料為 latin1,MySQL 解析器會做一些轉換:
... WHERE namecolumn = NAME_CONST('in_namecolumn',_utf8'MP201022' COLLATE 'utf8_general_ci')
可以在儲存過程中進行相應的編碼轉換(通常修改 varchar/char 欄位)使得可以正常使用索引,更多見: mysql-slow-when-run-as-stored-proc
... WHERE namecolumn = convert(in_namecolumn using latin1) collate latin1_swedish_ci
jdbc 直連執行 sql
通過 jdbc 連線執行 sql 的時候,如果編碼不一致,同樣需要對 varchar,char 型別進行轉換,如下所示:
... WHERE namecolumn = convert(in_namecolumn using latin1) collate latin1_swedish_ci
否則可能出現以下編碼不一致的錯誤(隨 mysql-connector 版本不同可能有不同的行為):
SQL state [HY000]: error code [1267]: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
jdbc useSSL 引數變更
在 mysql-connector-java 配置中,useSSL 引數有以下不同,從 5.1.38 開始 useSSL 開始按 MySQL 5.5.45+,5.6.26+ or 5.7.6+ 的版本預設開啟,對應的 requireSSL,verifyServerCertificate 兩個引數也會跟著開啟:
< 5.1.38: ConnectionProperties.useSSL=Use SSL when communicating with the server (true/false),defaults to 'false' >= 5.1.38 ConnectionProperties.useSSL=Use SSL when communicating with the server (true/false),default is 'true' when connecting to MySQL 5.5.45+,5.6.26+ or 5.7.6+,otherwise default is 'false'
MySQL 5.7.x 及以上的版本,預設會啟用 ssl,客戶端連線的時候會自協商加密,除非顯示指定不加密. mysql-connector-java 從 5.1.38 開始預設開啟 useSSL. 所以用低版本 jdbc 連線 MySQL 5.7.x 不會有加密的問題,用高版本 jdbc 連線 5.7.6+ 以上會有加密問題,需要顯示指定 useSSL=false,用高版本的 jdbc 連線 MySQL 5.5,5.6 不會有加密問題.
到此這篇關於MySQL編碼不一致可能引起的一些問題的文章就介紹到這了,更多相關MySQL編碼不一致引起的問題內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!