MySQL 各种问题

2011-11-14 Jerry MySQL

今天在 Mac OS 下碰到了 MySQL 的各种问题,因为在 Mac 下用 MySQL 的时间不多,所以不太好确定是哪一层面的原因,费了不少周折,最后算是都解决了。

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; 

标签: MySQL


发表评论:

Powered by emlog sitemap