mysql中character_set_connection的作用,mysqlcharacterset
character_set_client = x
character_set_results = x
character_set_connection = x;
我們常用在mysql操作類中使用這三面,下面大概說下作用:
character_set_client 客戶端使用的編碼,如GBK, UTF8 比如你寫的sql語句是什麼編碼的。
character_set_results 查詢返回的結果集的編碼(從數據庫讀取的數據是什麼編碼的)。
character_set_connection 連接使用的編碼
它們之前存在一個轉換過程(具本的還請見手冊):
character_set_client -> character_set_connection >內部操作字符集->character_set_results
見一篇文章:http://www.cnblogs.com/discuss/articles/1862248.html
如:utf8->utf8->utf8 gbk->utf8->utf8
類似於gbk->utf8->utf8這樣的轉換,有些同學可能有個疑問:
character_set_client 是gbk
character_set_connection 是utf8
character_set_results 也是utf8
為什麼不濾過character_set_connection部分,而它在這個中間階段起到一個什麼樣的作用。
google時,http://stackoverflow.com/questions/16082480/what-is-the-purpose-of-character-set-connection
老外也提到過樣的問題,本人英語差得很,也沒怎麼看完,最後轉而去看手冊去了。
在手冊中發現一句話:轉換時,服務器使用character_set_connection和collation_connection系統變量。它將客戶端發送的查詢從character_set_client系統變量轉換到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介詞)。collation_connection對比較文字字符串是重要的。對於列值的字符串比較,它不重要,因為列具有更高的 校對規則優先級。
請反復讀下這段話,尤其是紅色部分。現在說下我的理解:我們操作數據庫時,大多於表有關,但是並不是說操作數據庫一定要於表有關,如果使用表,則表和字段的字符集有優先,比如直接select length('中國人'),如果character_set_connection是utf8的則輸出9,如果是gbk則輸出6。各位可以通過修改字符集變量測試下。我想character_set_connection存在的意義大多是類似於此類用法吧。
如有說的不對的地方,請指正下,或者有更多的說法,也請說下。