數(shù)據(jù)庫默認字符集如下:
1: mysql> use ivm;
2: Database changed
3: mysql> show variables %char%';
4: +--------------------------+---------------------------------------------------------+
5: | Variable_name | Value |
6: +--------------------------+---------------------------------------------------------+
7: | character_set_client | latin1 |
8: | character_set_connection | latin1 |
9: | character_set_database | gbk |
10: | character_set_filesystem | binary |
11: | character_set_results | latin1 |
12: | character_set_server | latin1 |
13: | character_set_system | utf8 |
14: | character_sets_dir | D:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
15: +--------------------------+---------------------------------------------------------+
16: 8 rows in set (0.00 sec)
17:
18: mysql>
在 ivm數(shù)據(jù)庫中創(chuàng)建存儲過程及調(diào)用結(jié)果如下:
1: delimiter ;;
2: DROP PROCEDURE IF EXISTS r_test;
3: CREATE PROCEDURE r_test(IN inStr VARCHAR(255) )
4: BEGIN
5: SELECT CHARSET(inStr);
6: END;;
7: delimiter ;
8:
9: #下面的語句都執(zhí)行失敗,錯誤信息為:Data too long for inStr' at row 1
10: call r_test('中國');
11: call r_test(_gbk'中國');
12: SET @china = _gbk'中國';
13: CALL r_test(@china);
14: #執(zhí)行成功 返回值是:latin1
15: call r_test('china');
16:
17:
18: # 創(chuàng)建存儲過程中設置了 參數(shù)的字符集
19: delimiter ;;
20: DROP PROCEDURE IF EXISTS r_test2;
21: CREATE PROCEDURE r_test2(IN inStr VARCHAR(255) character set gbk)
22: BEGIN
23: SELECT CHARSET(inStr);
24: END;;
25: delimiter ;
26:
27: #執(zhí)行成功 返回值是:gbk
28: call r_test2('中國');
29: #執(zhí)行成功 即使執(zhí)行前設置了字符集是utf8返回值仍然是:gbk
30: call r_test2(_utf8'中國');
31: #執(zhí)行成功 返回值是:gbk
32: call r_test2('china');
結(jié)論:創(chuàng)建存儲過程時如果沒有指定存儲過程的參數(shù)的字符集,mysql總是認為當前的參數(shù)使用的是系統(tǒng)的字符集(windows 下 my.ini中的 default-character-set指定)。
否則,mysql總是認為存儲過程的參數(shù)使用的就是定義時指定的字符集。
需要注意的是:上面的規(guī)則和當前的連接字符集沒有任何的關系(使用mysql_options(m_pMySql, MYSQL_SET_CHARSET_NAME, "utf8")也不會改變)