多是由於看了太多網上的關於這個問題的解決辦法,可能當時是我本身沒有看明白也或許是狀況不同,反正都沒有解決我當初遇到的問題,如今想一想多是本身當初太無知了,第二個緣由是原來大多數狀況下是在windows環境下開發,涉及到數據庫的時候有專門的DBA負責處理,對於簡單的設置或許就用圖形管理工具設置,最近本身在鼓搗一個東西的時候是在Linux環境下,若是沒有使用phpmyadmin的狀況下,這個時候的數據庫字符設置問題可能就會有那麼一點困難,因此特別想跟你們分享一下這篇隨筆,很早就寫了,趁今天空閒給貼出來,其中個人辦法根本就不是最好的,可是就像個人標題同樣,是我本身的解決歷程,汗啊。php
事情是這樣發生的,我用這樣一個命令建立了數據庫:mysql
1 mysql> create database db_name; 2 Query OK, 1 row affected (0.02 sec)
提示建立成功,讓咱們檢查一下:web
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)
不錯確實成功了,來建立一個表讓咱們來插入數據吧,sql
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,表已經建立成功了。apache
下面關鍵時刻,來插點數據吧:windows
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,看結果也沒有問題。socket
我擦,奇怪啊,原來明明不行的,如今怎麼好了呢?(/ □ \),回想一下我對這個數據庫作了什麼。如今再用一個新的環境從新作一遍:工具
首先安裝一個數據庫(固然是在另外一臺機器上):
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個操做:
來兩個小插曲,
首先更改配置文件中綁定的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,便可。
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.
最後想說一句,凡事都怕認真。