issue: mysql資料庫儲存的中文為亂碼
env: deiban + mysql 5.1.47
1、mysql字符集
mysql> show character set;
任何乙個給定的字符集至少有乙個校對規則。它可能有幾個校對規則。
mysql> show collation like 'ucs2%';
mysql> show collation like 'utf8%';
校對規則命名約定:它們以其相關的字符集名開始,通常包括乙個語言名,並且以_ci (大小寫不敏感)、_cs (大小寫敏感)或_bin (二元)結束。
檢視當前字符集設定
mysql> show variables like 'character_set_%';
mysql> show variables like 'collation_%';
修改資料庫的字符集
mysql>use dbname
mysql>alter database dbname character set utf8 collate utf8_general_ci;
mysql>create database dbname character set utf8;
或者通過配置檔案修改:
修改/var/lib/mysql/dbname/db.opt
default-character-set=latin1
default-collation=latin1_swedish_ci
為 default-character-set=utf8
default-collation=utf8_general_ci
然後重起mysql。
修改mysql的表的字符集
mysql> alter table table_name default character set utf8 collate utf8_general_ci;
伺服器使用character_set_client 變數作為客戶端傳送的查詢中使用的字符集。
伺服器接收到查詢後應該轉換為哪種字符集?
伺服器使用character_set_connection
和collation_connection
系統變數。它將客戶端傳送的查詢從character_set_client
系統變數轉換到character_set_connection
(除 非字串文字具有象_latin1 或_utf8 的引介詞)。
伺服器傳送結果集或返回錯誤資訊到客戶端之前應該轉換為哪種字符集?
character_set_results 變數指示伺服器返回查詢結果到客戶端使用的字符集。包括結果資料,例如列值和結果 元資料(如列名)。
字符集轉換流程
client(如servlet)傳送乙個查詢 -> 伺服器收到查詢,將查詢串從character_set_client 轉換到character_set_connection,然後執行轉換後的查詢 -> 伺服器將結果資料轉換到character_set_results字符集後發送回客戶端。
調整這些變數的設定
有兩個語句影響連線字符集:
set names 'charset_name'
set character set charset_name
set names 顯示客戶端傳送的sql 語句中使用什麼字符集。因此,set names 'cp1251' 語句告訴伺服器「將來從這個客戶端傳來的資訊採用字符集 cp1251」 。 它還為伺服器傳送回客戶端的結果指定了字符集。(例如,如果你使用乙個select 語句, 它 表示列值使用了什麼字符集。)
set names 'x ' 語句與這三個語句等價:
mysql> set character_set_client = x;
mysql> set character_set_results = x;
mysql> set character_set_connection = x;
將x 設定為character_set_connection 也就設定了collation_connection 是x 的預設校對規則。
set character set 語句是類似的,但是為 預設資料庫設定連線字符集和校對規則。set character set x 語句與這三個語句等價:
mysql> set character_set_client = x;
mysql> set character_set_results = x;
mysql> set collation_connection = @@collation_database;
當乙個客戶端連線時,它向伺服器傳送希望使用的字符集名稱。伺服器為那個字符集設定character_set_client 、character_set_results 和 character_set_connection 變數。(實際上,伺服器為使用該字符集執行乙個set names 操作。)
對於mysql客戶端,如果你希望使用與預設字符集不同的字符集,不需要每次 啟動時執行set names 語句。可以在mysql語句行中或者選項檔案中新增乙個--default-character-set 選 項設定。例如,你每次執行mysql時,以下的選項檔案設定把三個字符集變數修改為koi8r:
[mysql]
default-character-set=koi8r
例如:假設column1 定義為char(5) character set latin2 。如果沒有設定set names 或set character set select column1 from t ,當連線後,伺服器使用客戶端指定的字符集返回列column1 的所有值。 另一方面,如果你設定set names 'latin1' 或set character set latin1 ,那麼傳送結果之前,伺服器轉換latin2 值到latin1 。 轉換可能會丟失那些不屬於兩種字符集的字元。
,那麼對於
如果不希望伺服器執行任何轉換,設定character_set_results 為null :
mysql> set character_set_results = null;
使用jdbc鏈結mysql時,可以在url中指定字符集
jdbc:mysql://localhost:3306/dbname?useunicode=true&characterencoding=gbk
url在xml配置檔案中的寫法:
jdbc:mysql://localhost:3306/dbname?useunicode=true&characterencoding=gbk
&是&的轉義字元。
2、解決方法
(1) 修改/etc/mysql/my.cnf,加入:
[mysqld]
default-character-set = gbk
init_connect = 'set names gbk'
[client]
default-character-set = gbk
(2)在jdbc鏈結串中指定字符集為gbk
jdbc:mysql://localhost:3306/dbname?useunicode=true&characterencoding=gbk
mysql中文亂碼子集 MySQL中文亂碼問題
中文亂碼問題在我們的mysql課程中常常出現,很多人在求助網路幫助的時候,往往達不到解決中文亂碼的目的,我這裡就我遇到過的一些問題進行彙總,並在以後不斷的新增新的問題!1 初窺門徑 眾所周知,出現中文亂碼問題一定是由字符集編碼問題引發的,但是很多時候我們都是對mysql配置檔案my.ini中的如下 ...
mysql中文亂碼 簡書 MySQL中文亂碼
檢視編碼 show variables like character 修改編碼 mysql set character set client utf8 mysql set character set connection utf8 mysql set character set database u...
mysql中文亂碼
以前存db裡的東西都是英文本母,今天存了個中文,居然是個 鬱悶 ing。在命令列中 執行show variables like character 然後用set names utf8 set character set server utf8 然後在執行show variables like cha...