MySQL Workbench 無法使用
之前是用的 XAMPP 的 MySQL 組件,以前的使用相對比較簡單,只是把數據庫導入進去之後就在 Web 上直接用了,沒有發現這個組件存在的問題,今天用 MySQL Workbench 訪問這個庫,發現報各種錯誤,主要的意思是/var/folders/下的某個詭異的目錄沒有讀寫權限,更改了目錄讀寫權限後也是錯誤依舊。本來猜測是 Workbench 自己的原因,後來下載的新的版本也還是不能行。查看 MySQL 數據文件夾下的 err 文件,發現這個 MySQL 服務組件居然報了n多烏七八糟的錯誤,看來這個服務端已經不能要了。重新下載了個官方的 MySQL for Mac 版本,mysql-5.5.17-osx10.6-x86.dmg,裝上去把庫也掛上去,Workbench 居然好了。
由此看來,當 Workbench 出問題的時候,先不要著急罵 Workbench,看看自己的庫是不是已經危了。
MySQL 訪問權限
MySQL 比較白癡,127.0.0.1 和 localhost 不知道是一碼事,在權限表裡面是分開的。在修改密碼的時候,一開始只改了1行,把localhost 改成了 %,登陸進去也好好的,但就是看不到庫,比較讓人崩潰。後來把兩行都重新設置了才正常。另外,如果加外面的訪問 % 的時候,最好單加一行,別把原來的刪掉,不然也會容易錯亂。
如果新創建用戶,並且開通訪問權限,其實寫 localhost 和 % 這兩個就成了。
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
MySQL JDBC 連接
JDBC 訪問 MySQL 的連接方式有點奇怪,用 127.0.0.1 可以正常訪問,但是 localhost 會被拒絕。粗略看了下原因,如果是 localhost,在連接的時候會用本地的 IP 地址直接訪問,如果這個IP 地址不在 MySQL 的訪問權限表裡,就會被拒絕掉。這個問題在 PHP 下面就沒有發生,深層次的原因有空的時候好好分析分析。
MySQL 編碼
MySQL 的編碼總是非常惡心,用默認的配置啟動,在程序裡插入中文,提示:error 1336 (HYOOO):Incorrect string values:...
首先,考慮是服務器編碼的問題,在my.cnf 的[mysqld]裡面添加了:
character_set_server = utf8
在 MySQL 裡確認字符集已均改為 utf8:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.5.17-osx10.6-x86/share/charsets/ |
+--------------------------+-----------------------------------------------------+
但是,中文數據依然無法插入,錯誤依舊,考慮庫和表的字符集的問題,更改庫字符集:
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;
依舊不行,更改原表的字符集:
ALTER TABLE temp_table DEFAULT CHARACTER SET utf8;
依舊還是不行,再繼續把表默認的字符集和所有字符列(CHAR,VARCHAR,TEXT)改為新的字符集:
ALTER TABLE temp_table CONVERT TO CHARACTER SET utf8;
確認查看各個列的字符集:
mysql> show full columns from temp_table;
+--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| No | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Name | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Price | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Count | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Date | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Source | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| Export | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
7 rows in set (0.01 sec)
終於正常!
另外加一句,如果MySQL 服務端設置好之後,JDBC 或者 PHP 連接 MySQL 中文還是有問題,那多半是 Conn 的字符集問題,最好在查詢開始前加一句:SET NAMES 'utf8'; 這句相當於:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;