如若轉載本文,請註明原始出處: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);
}
就分析這麼多了。