Mysql亂碼問題解決歷程

   可能是因爲看了太多網上的關於這個問題的解決辦法,可能當時是我自己沒有看明白也或許是情況不一樣,反正都沒有解決我當初遇到的問題,現在想想可能是自己當初太無知了,第二個原因是原來大多數情況下是在windows環境下開發,涉及到數據庫的時候有專門的DBA負責處理,對於簡單的設置或許就用圖形管理工具設置,最近自己在鼓搗一個東西的時候是在Linux環境下,如果沒有使用phpmyadmin的情況下,這個時候的數據庫字符設置問題可能就會有那麼一點困難,所以特別想跟大家分享一下這篇隨筆,很早就寫了,趁今天空閒給貼出來,其中我的辦法根本就不是最好的,但是就像我的標題一樣,是我自己的解決歷程,汗啊。

   事情是這樣發生的,我用這樣一個命令創建了數據庫:

1 mysql> create database db_name;  2 Query OK, 1 row affected (0.02 sec)

  提示創建成功,讓我們檢查一下:

 1 mysql> show databases;   2 +--------------------+   3 | Database           |   4 +--------------------+   5 | information_schema |   6 | db_name            |   7 | mysql              |   8 | oaonline           |   9 | performance_schema |  10 | phpmyadmin         |  11 | test               |  12 +--------------------+  13 7 rows in set (0.00 sec)

不錯確實成功了,來創建一個表讓我們來插入數據吧,

1 mysql> use db_name;  2 Database changed  3 mysql> CREATE TABLE test_main (id INT, value VARCHAR(10), PRIMARY KEY(id));  4 Query OK, 0 rows affected (0.17 sec)

同樣我們來驗證一下:

1 mysql> show tables;  2 +-------------------+  3 | Tables_in_db_name |  4 +-------------------+  5 | test_main         |  6 +-------------------+  7 1 row in set (0.00 sec)

OK,表已經創建成功了。

下面關鍵時刻,來插點數據吧:

 1 mysql> insert into test_main(value) values ("北京");   2 Query OK, 1 row affected (0.04 sec)   3    4 mysql> select * from test_main;   5 +----+--------+   6 | id | value  |   7 +----+--------+   8 |  0 | 北京   |   9 +----+--------+  10 1 row in set (0.00 sec)  11   12 mysql> 

哎呦喂,看起來沒有問題了呀,那意思是可以用了唄。好吧開始寫代碼。

1 require 'mysql2'  2 client = Mysql2::Client.new(:host => "localhost", :username => "root",:password=>"root",:database=>"db_name")  3 client.query("INSERT INTO  `db_name`.`test_main` (`id` ,`value`)VALUES ('2',  '北京');");

OK,看結果也沒有問題。

我擦,奇怪啊,原來明明不行的,現在怎麼好了呢?(/ □ \),回想一下我對這個數據庫做了什麼。現在再用一個新的環境重新做一遍:

首先安裝一個數據庫(當然是在另一臺機器上):

1 sudo apt-get install mysql-server

........

安裝成功,按照以上測試創建一個測試數據庫

 1 mysql> create database db_character;   2 Query OK, 1 row affected (0.00 sec)   3    4 mysql> show databases;   5 +--------------------+   6 | Database           |   7 +--------------------+   8 | information_schema |   9 | db_character       |  10 | mysql              |  11 | performance_schema |  12 | test               |  13 +--------------------+  14 5 rows in set (0.00 sec)

然後創建測試表:

1 mysql> use db_character;  2 Database changed  3 mysql> CREATE TABLE test_main (id INT, value VARCHAR(10), PRIMARY KEY(id));  4 Query OK, 0 rows affected (0.64 sec)

來插條數據吧:

 1 mysql> insert into test_main(value) values ("北京");   2 Query OK, 1 row affected, 1 warning (0.08 sec)   3    4 mysql> select * from test_main;   5 +----+-------+   6 | id | value |   7 +----+-------+   8 |  0 | ??    |   9 +----+-------+  10 1 row in set (0.00 sec)

OK,亂碼啦。

當初我是這樣做的,baidu,google,發現有人這麼說:

先查看一下這個數據庫的字符集:

 1 mysql> show variables like 'character%';   2 +--------------------------+----------------------------+   3 | Variable_name            | Value                      |   4 +--------------------------+----------------------------+   5 | character_set_client     | utf8                       |   6 | character_set_connection | utf8                       |   7 | character_set_database   | latin1                     |   8 | character_set_filesystem | binary                     |   9 | character_set_results    | utf8                       |  10 | character_set_server     | latin1                     |  11 | character_set_system     | utf8                       |  12 | character_sets_dir       | /usr/share/mysql/charsets/ |  13 +--------------------------+----------------------------+  14 8 rows in set (0.00 sec)

 看到character_set_database,character_set_server的默認字符集是latin1,修改一下默認字符集:
 在配置文件/etc/mysql/my.cnf,在[mysqld]中添加character-set-server=utf8

 1 [mysqld]   2 #   3 # * Basic Settings   4 #   5 user            = mysql   6 pid-file        = /var/run/mysqld/mysqld.pid   7 socket          = /var/run/mysqld/mysqld.sock   8 port            = 3306   9 basedir         = /usr  10 datadir         = /var/lib/mysql  11 tmpdir          = /tmp  12 lc-messages-dir = /usr/share/mysql  13 skip-external-locking  14 character-set-server=utf8

然後重新啓動數據庫,再次查看字符集:

 1 mysql> show variables like 'character%';   2 +--------------------------+----------------------------+   3 | Variable_name            | Value                      |   4 +--------------------------+----------------------------+   5 | character_set_client     | utf8                       |   6 | character_set_connection | utf8                       |   7 | character_set_database   | utf8                       |   8 | character_set_filesystem | binary                     |   9 | character_set_results    | utf8                       |  10 | character_set_server     | utf8                       |  11 | character_set_system     | utf8                       |  12 | character_sets_dir       | /usr/share/mysql/charsets/ |  13 +--------------------------+----------------------------+  14 8 rows in set (0.00 sec)

這樣改過了,我們在添加一條記錄:

 1 mysql> insert into test_main(id,value) values (1,"北京-北京");   2 Query OK, 1 row affected, 1 warning (0.07 sec)   3    4 mysql> select * from test_main;   5 +----+-------+   6 | id | value |   7 +----+-------+   8 |  0 | ??    |   9 |  1 | ??-?? |  10 |  2 | ??    |  11 +----+-------+  12 3 rows in set (0.00 sec)

特麼的,還是不行有沒有,偶然間我發現了一個問題,

我修改完成以後,這個數據庫的字符集和排序規則依然還是latin,好吧。難道我修改的沒有作用,我在創建一個數據庫在看一下:

1 mysql> create database testagain;  2 Query OK, 1 row affected (0.00 sec)

好吧,有點意思。修改了數據庫的字符集,已經存在的數據庫的字符集是不受影響的,那就單改一下指定數據庫的編碼格式:

1 mysql> ALTER DATABASE `db_character` character set utf8;  2 Query OK, 1 row affected (0.01 sec)

 

 在插入數據來試試:

 1 mysql> insert into test_main(id,value) values (3,"北京-北京");   2 Query OK, 1 row affected, 1 warning (0.01 sec)   3    4 mysql> select * from test_main;   5 +----+-------+   6 | id | value |   7 +----+-------+   8 |  0 | ??    |   9 |  1 | ??-?? |  10 |  2 | ??    |  11 |  3 | ??-?? |  12 +----+-------+  13 4 rows in set (0.00 sec)

嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷,OMG,硬着頭皮去弄一下吧。我更改了數據庫的字符集,也應該改一下表的字符集

1 mysql> ALTER TABLE `test_main` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;  2 Query OK, 4 rows affected (0.05 sec)  3 Records: 4  Duplicates: 0  Warnings: 0

沒有驚喜,問題依然存在,

 1 mysql> insert into test_main(id,value) values (4,"北京-北京");   2 Query OK, 1 row affected, 1 warning (0.01 sec)   3    4 mysql> select * from test_main;   5 +----+-------+   6 | id | value |   7 +----+-------+   8 |  0 | ??    |   9 |  1 | ??-?? |  10 |  2 | ??    |  11 |  3 | ??-?? |  12 |  4 | ??-?? |  13 +----+-------+  14 5 rows in set (0.00 sec)

Then,我發現了這個


數據庫,數據表的字符集改過之後,表中的字段的字符集和排序規則確沒有更改,那好吧,

1 mysql> ALTER TABLE `test_main` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL;   2 Query OK, 5 rows affected (0.04 sec)  3 Records: 5  Duplicates: 0  Warnings: 0

Got it:

 1 mysql> insert into test_main(id,value) values (5,"北京-北京");   2 Query OK, 1 row affected (0.10 sec)   3    4 mysql> select * from test_main;   5 +----+---------------+   6 | id | value         |   7 +----+---------------+   8 |  0 | ??            |   9 |  1 | ??-??         |  10 |  2 | ??            |  11 |  3 | ??-??         |  12 |  4 | ??-??         |  13 |  5 | 北京-北京     |  14 +----+---------------+  15 6 rows in set (0.00 sec)

 

我能小小的總結一下不,不涉及原理,只是歸納一下,在以後如何沒有圖形管理工具的時候,依然能夠正確的設置mysql關於字符集相關的東西。

一:在安裝完數據庫的時候,先不要創建數據庫,先去更改字符集設置。

二:如果在沒有設置字符集的時候就創建數據庫的時候,如果想更改默認設置就比較麻煩了要做如下3個操作:

  1. 更改數據庫的字符集設置。
  2. 更改數據庫中表的字符集設置。
  3. 修改數據庫中表的相關字段的字符集和所按字符集排序設置。

 

來兩個小插曲,

  • 我想遠程訪問數據庫,

首先更改配置文件中綁定的ip地址:

1 /etc/mysql/my.cnf  2 bind-address        = 192.168.0.125

然後在mysql中授權,

1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;  2 Query OK, 0 rows affected (0.00 sec)

然後重新啓動mysql,即可。

  • 安裝PHPMYADMIN

  

1 sudo apt-get install phpmyadmin

............................

開始安裝:選擇web容器,數據庫,phpmyadmin的帳號密碼:

        

然後,將phpmyadmin連接到apache中,

1 sudo ln -s /usr/share/phpmyadmin /var/www

OK,重啓apache: 

1 sudo /etc/init.d/apache2 restart 

然後驗證一下:

在瀏覽器中請求http://localhost/phpmyadmin  注意localhost部分必須是能夠訪問數據庫的有效主機名或者ip地址

 OK.

 

最後想說一句,凡事都怕認真。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章