再谈mysql的配置文件my.ini or my.cnf (之一)

如若转载本文,请注明原始出处:http://hi.baidu.com/hexiong/blog/item/e860e5dd9b0d3ae376c6381a.html
(hexiong@baidu or iihero@CSDN)

偶尔碰到有人问使用mysql命令行,老让人输入--default-character-set=gbk之类无聊的选项,让人烦。让人多输入了几个字符,确实有点不对劲。

加上有时候自己有时候DIY,很少在windows上使用安装的版本,总是解压缩,然后放一个my.ini到解压缩目录下边的某一个特殊的位置。这样,mysql命令行,缺省情况下,反而load不到这个配置文件了。

关于my.ini文件的加载顺序,详见:http://hi.baidu.com/hexiong/blog/item/313534a8b7e0dcbdcb130cc5.html

以windows为例,它会这样加载:
C:/WINDOWS/my.cnf C:/WINDOWS/my.ini C:/my.cnf  C:/my.ini
至于$installdir/my.ini,嘿, 不是安装版,这个变量估计是读不到了。
上述四个文件,只要前面的某一个文件加载成功,就不再加载后边指定的配置文件了。

所以,要想使mysql命令行直接使用gbk字符集,有下述方法:
1. 命令行:
mysql -u test -p --default-character-set=gbk
2. 命令行:
mysql --defaults-file=<your real my.ini path> -u test -p
注意 --defaults-file永远要放到第一个参数的位置
3. 直接制作一个客户端版本的my.ini,如:
#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions
[client]
port        = 3306
default_character_set=gbk
把它存到c:/my.ini
这里需要说明的是:
如果你定制的mysql中my.ini文件本来就在上边4个路径里头,直接修改里边[client]下的default_character_set值为gbk好可。否则就可以生成一个专为client使用的my.ini

方法3虽然方便,但因为是全局配置文件,所以有时候不免会相互影响,尤其是一台机器有多个mysql。

这个时候,可以使用命令行:
d:/>mysql -u test -p --default-character-set=latin1
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or /g.
Your MySQL connection id is 10 to server version: 5.0.9-beta-nt

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.

mysql> show variables like 'char%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | latin1                                    |
| character_set_connection | latin1                                    |
| character_set_database   | gbk                                       |
| character_set_results    | latin1                                    |
| character_set_server     | gbk                                       |
| character_set_system     | utf8                                      |
| character_sets_dir       | d:/mysql-5.0.9-beta-win32/share/charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)

--default-character-set=latin1会覆盖全局文件my.ini中[client]的字符集选项值。

当然,如果我们仔细查看源代码,还会发现$INSTALLDIR指的就是环境变量:MYSQL_HOME,呵呵。
如果你指定了MYSQL_HOME,在找不到前边4个文件的时候,它会去查找$MYSQL_HOME/my.cnf或my.ini

相关源码如下:

static const char **init_default_directories(MEM_ROOT *alloc)
{
const char **dirs;
char *env;
int errors= 0;

dirs= (const char **)alloc_root(alloc, DEFAULT_DIRS_SIZE * sizeof(char *));
if (dirs == NULL)
return NULL;
bzero((char *) dirs, DEFAULT_DIRS_SIZE * sizeof(char *));

#ifdef __WIN__

{
char fname_buffer[FN_REFLEN];
if (my_get_system_windows_directory(fname_buffer, sizeof(fname_buffer)))
errors += add_directory(alloc, fname_buffer, dirs);

if (GetWindowsDirectory(fname_buffer, sizeof(fname_buffer)))
errors += add_directory(alloc, fname_buffer, dirs);

errors += add_directory(alloc, "C:/", dirs);

if (my_get_module_parent(fname_buffer, sizeof(fname_buffer)) != NULL)
errors += add_directory(alloc, fname_buffer, dirs);
}

#elif defined(__NETWARE__)

errors += add_directory(alloc, "sys:/etc/", dirs);

#else

errors += add_directory(alloc, "/etc/", dirs);
errors += add_directory(alloc, "/etc/mysql/", dirs);

#if defined(DEFAULT_SYSCONFDIR)
if (DEFAULT_SYSCONFDIR != "")
errors += add_directory(alloc, DEFAULT_SYSCONFDIR, dirs);
#endif /* DEFAULT_SYSCONFDIR */

#endif

if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV))))
errors += add_directory(alloc, env, dirs);

/* Placeholder for --defaults-extra-file=<path> */
errors += add_directory(alloc, "", dirs);

#if !defined(__WIN__) && !defined(__NETWARE__)
errors += add_directory(alloc, "~/", dirs);
#endif

return (errors > 0 ? NULL : dirs);
}

 

就分析这么多了。

posted @ 2010-05-13 05:05  张长胜  阅读(196)  评论(0编辑  收藏  举报