我建立的数据库,我在my.ini修改了字符集。字符集显示如下:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+---------------------------------------------------
-----+
| Variable_name            | Value
     |
+--------------------------+---------------------------------------------------
-----+
| character_set_client     | gbk
     |
| character_set_connection | gbk
     |
| character_set_database   | gbk
     |
| character_set_results    | gbk
     |
| character_set_server     | gbk
     |
| character_set_system     | utf8
     |
| character_sets_dir       | D:\Program Files\MySQL\MySQL Server 5.0\share\char
ets/ |
+--------------------------+---------------------------------------------------
-----+
7 rows in set (0.01 sec)mysql>  SHOW VARIABLES LIKE 'collation_%';
+----------------------+----------------+
| Variable_name        | Value          |
+----------------------+----------------+
| collation_connection | gbk_chinese_ci |
| collation_database   | gbk_chinese_ci |
| collation_server     | gbk_chinese_ci |
+----------------------+----------------+
3 rows in set (0.01 sec)数据库里面的数据均能正常显示,但是存储过程里面的所有汉字都是乱码,包括注释的。我从网上找了好多资料没有结果。请问哪位遇到过如何的问题,帮忙给给提示。谢谢。

解决方案 »

  1.   

    这个是你当初用客户端建立存储过程时,由于客户端的字符集与服务端的字符集不一致而产生的
    这个不单是MYSQL,在oracle里面也会出现这样的现象
    所以,你在执行建立存储过程时,最好先设置2端的字符集兼容。
      

  2.   

    我客户端用的字符集一直都是gbk阿,为什么我通过客户端插入一条数据就没有乱码呢阿?按说他们是用同样一个客户端阿,同样的字符集阿?
      

  3.   

    show procedure status like 'quyanli123_126_com';看一下。估计是如二楼所说。mysql> show procedure status like 'quyanli123_126_com';
    +------+--------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    | Db   | Name               | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
    +------+--------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    | test | quyanli123_126_com | PROCEDURE | root@localhost | 2009-06-25 18:38:17 | 2009-06-25 18:38:17 | DEFINER       |         | gbk                  | gbk_chinese_ci       | latin1_swedish_ci  |
    +------+--------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
    1 row in set (0.00 sec)mysql>
      

  4.   

    mysql>  show procedure status like 'pro1';
    +--------------+---------------------+-----------+----------------+-------------
    --------+---------------------+---------------+---------+
    | Db           | Name                | Type      | Definer        | Modified        | Created             | Security_type | Comment |
    +--------------+---------------------+-----------+----------------+-------------
    --------+---------------------+---------------+---------+
    | aa           | pro1| PROCEDURE | root@localhost | 2009-06-23 1
    6:16:46 | 2009-06-23 16:16:46 | DEFINER       |         |
    我按楼上的说法执行了 可是没有显示出字符集的信息。我用的是5.0的数据库。
      

  5.   

    在你的create procdure 语句中指定一下输入参数的字符集。CREATE PROCEDURE `quyanli123_126_com`(xx char(30) character set gbk )
    BEGIN
      SELECT xx;
    END
      

  6.   

    http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码贴出你的以下信息。表的字符集信息
    show create table t1;连接及系统字符集信息。
    show variables like 'char%';
      

  7.   

    mysql> SHOW VARIABLES LIKE 'character_set_%';
    +--------------------------+---------------------------------------------------
    -----+
    | Variable_name            | Value
         |
    +--------------------------+---------------------------------------------------
    -----+
    | character_set_client     | gbk
         |
    | character_set_connection | gbk
         |
    | character_set_database   | gbk
         |
    | character_set_results    | gbk
         |
    | character_set_server     | gbk
         |
    | character_set_system     | utf8
         |
    | character_sets_dir       | D:\Program Files\MySQL\MySQL Server 5.0\share\char
    ets/ |楼上说的显示表信息?具体显示哪个表啊?表的信息和存储过程有关系吗?
      

  8.   

    那就提供你的 create procedure 的语句了,我需要在我本机测试想办法再现你的问题啊。否则我自己做的测试是正常的,mysql> SHOW VARIABLES LIKE 'character_set_%';
    +--------------------------+------------------------------------------------
    | Variable_name            | Value
    +--------------------------+------------------------------------------------
    | character_set_client     | gbk
    | character_set_connection | gbk
    | character_set_database   | latin1
    | character_set_filesystem | binary
    | character_set_results    | gbk
    | character_set_server     | latin1
    | character_set_system     | utf8
    | character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.1\share\c
    +--------------------------+------------------------------------------------
    8 rows in set (0.00 sec)mysql>
    mysql> delimiter //
    mysql> CREATE PROCEDURE `quyanli123_126_com`(xx char(30) character set gbk )
        -> BEGIN
        ->   SELECT xx;
        -> END;
        -> //
    Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
    mysql>
    mysql> call quyanli123_126_com('字符集');
    +--------+
    | xx     |
    +--------+
    | 字符集 |
    +--------+
    1 row in set (0.06 sec)Query OK, 0 rows affected (0.06 sec)mysql>
      

  9.   

    DELIMITER $$DROP PROCEDURE IF EXISTS `test`.`aa`$$CREATE PROCEDURE `test`.`aa` ()
    BEGIN
    select('好');
    END$$DELIMITER ;
    一开始显示是这样的,但是第二次打开就变成
    DELIMITER $$DROP PROCEDURE IF EXISTS `test`.`aa`$$CREATE PROCEDURE `aa`()
    BEGIN
    select('??');
    END$$DELIMITER ;
    也就是在数据库中保存的是这个乱码的。