1. 程式人生 > >Mysql修改已有數據的字符集

Mysql修改已有數據的字符集

class his unsigned def big line run mysql存儲 can

Mysql修改已有數據的字符集

問題

在生產環境中跑了很久,發現MysqlClient連接的字符集是默認的latin1,我們一直以為都是utf8,造成這樣的誤解,是因為在內網環境中,我們是源碼編譯的Mysql,並指定了編譯選項字符集位utf8,這時Mysql的是默認字符接都是utf8.

而在外網,我們是二進制包安裝,默認是latin1,雖然在my.conf中指定了[client] [mysql] [mysqld] 中字符集為utf8,這並不能保證MysqlClient連接時的字符集為utf8.所以最好是在建立連接是指定字符集,這個是能保證的.如:

//C連接 需在建立連接前設置
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, "
utf8");

由於數據是通過laint1連接到Mysql存儲的,所以取數據也需要laint1的連接方式.但這個方式與預期不符,而且其他客戶端連接會通過utf8連接,這就會導致亂碼,必須修復成通過utf8連接存儲的數據.

修復原理

通過latin1的方式建立連接把數據取出,然後以通過utf8的方式建立連接把數據存回去.

修復事例

表結構定義如下:

CREATE TABLE IF NOT EXISTS `tbl_friend` (
  `Uin` bigint(20) unsigned NOT NULL,
  `Name` varchar(255) CHARACTER SET
utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`Uin`), UNIQUE KEY `Name` (`Name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select CONCAT(update tbl_friend set `Name`=\‘‘, Name, \ where Uin=, Uin,;) from tbl_friend into outfile /tmp/UpdateFriendName.sql CHARACTER SET latin1;

在mysql中執行上面的語句,然後在mysql中導入/tmp/UpdateFriendName.sql文件,數據就修復了. 需要註意的是,my.cnf的[mysql]段中字符集是你修改後的字符集或者通過 mysql --default-character-set=utf8 < /tmp/UpdateFriendName.sql 指定修復後的字符集.

修復後可以在mysql中通過set names utf8/latin1,然後select Name from tbl_friend limit 10; 來看變化,

可能遇到的阻礙

如果在執行當中遇到 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 需要在my.conf中的[mysqld]增加secure_file_priv =,然後重啟Mysql.

Mysql修改已有數據的字符集