mysql 插入中文亂碼解決方案 轉

season0891發表於2014-08-25

轉自http://www.cnblogs.com/pricks

"

MySQL 4.1的字符集支援(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。對於字符集的支援細化到四個層次: 伺服器(server),資料庫(database),資料表(table)和連線(connection)。下面將分兩部分,分別設定伺服器編碼和資料 庫、資料表與連線部分的編碼,從而杜絕中文亂碼的出現。

  一 伺服器編碼設定

  伺服器編碼設定方法有二:

  一是安裝mysql時,其中會有一個步驟選擇編碼方式,此時選擇gbk即可。如果不選擇,預設的編碼是latin1;

  二是在安裝玩mysql之後,手動修改其配置檔案,如下:

  (1)修改 MySql安裝目錄下面的my.ini(MySQL Server Instance Configuration 檔案)。 設定

        default-character-set=gbk(注意,有2處) 
  (2)修改data目錄中相應資料庫目錄下的db.opt配置檔案
        default-character-set=gbk
        default-collation=gbk_chinese_ci
 
  重啟資料庫,關閉控制檯視窗重新登入資料庫即可。
 
  二 資料庫、資料表和連線部分的編碼設定
  2.1 設定資料庫和資料表編碼
  要解決亂碼問題,首先必須弄清楚資料庫和資料表用什麼編碼。如果沒有指明,將是預設的latin1。
用得最多的應該是這3種字符集 gb2312,gbk,utf8。
  如何去指定資料庫和資料表的字符集呢?下面也gbk為例:
  【在MySQL Command Line Client建立資料庫 】
  mysql> CREATE TABLE `mysqlcode` (
  -> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  -> `content` VARCHAR( 255 ) NOT NULL
  -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
  Query OK, 0 rows affected, 1 warning (0.03 sec)
  其中後面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
就是指定資料庫的字符集,COLLATE (校勘),讓mysql同時支援多種編碼的資料庫。
  當然也可以透過如下指令修改資料庫資料表的字符集:
    alter database mysqlcode default character set 'gbk'.
  前面已經設定了伺服器、資料庫和資料表的編碼,那麼資料庫中的編碼便都是
gbk,中文可以儲存進去。
但是如果你要透過執行insert或select等操作時,仍然會出現中文亂碼問題,這是因為還沒設定
“連線(connection)”部分的編碼,而insert、select等資料庫操作都包含與資料庫的連線動作。如果不信
,你現在可以執行下面的sql文試一試:
  mysql> insert into mysqlcode values(null,'java愛好者');
  按回車,結果如下:
  ERROR 1406 (22001): Data too long for column 'content' at row 1
  
  2.2 設定連線編碼
  設定了伺服器、資料庫和資料表部分的編碼,必須設定連線編碼。連線編碼設定如下:
  mysql> SET character_set_client='gbk';
  mysql> SET character_set_connection='gbk'
  mysql> SET character_set_results='gbk'

  設定好連線編碼,下面便可以成功插入中文了:
  mysql> insert into mysqlcode values(null,'java愛好者');
  Query OK, 0 rows affected (0.02 sec)
  
  其實,上面設定連線編碼的三條命令可以簡化為一條:
  mysql> set names 'gbk';
  
  設定好了連線編碼後,在select查詢時,也能正確顯示中文:
  mysql> select * from mysqlcode;
  +----+-----------+
  | id | content |
  +----+-----------+
  | 1   | java愛好著 |
  +----+-----------+
  1 row in set (0.00 sec)
 
 
  三 完整示例
  下面將用一個例子完整地將上面的理論演示一遍,最後達到能向mysql中插入中文的目的:
  3.1 設定mysql伺服器編碼
  這一步請參見上文第一節,主要就是在安裝mysql之後,修改my.ini和dataTable.db中的編碼為gbk
 
  3.2 建立一個資料庫
  先連線到本地資料庫:mysql -h localhost -u root -proot,接著建立一個資料庫:
  mysql> create database test;
 
  3.3 建立資料表並設定其編碼
  -- 中文編碼測試資料表
  use test
  DROP TABLE IF EXISTS `test`.`test_nml`;
  SET @saved_cs_client = @@character_set_client;
  SET character_set_client = gbk;
  CREATE TABLE  `test`.`test_nml` (
    `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `content` VARCHAR( 255 ) NOT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='使用者基本資訊';
  SET character_set_client = @saved_cs_client;
  這裡的紅色部分等價於上文中的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
  3.4 插入中文資料
  --插入資料
  SET @saved_cs_client = @@character_set_client;
  set names gbk;
  insert into test_nml values(null,'我是中文');
  
  注意:每次執行insert或update或select連線操作時,都必須設定編碼,即在前面加上:set names 'gbk';
"

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-1257376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章