mysql 存储过程字符集

转载自:http://www.cppblog.com/zaccheo/archive/2013/03/22/198728.html

数据库默认字符集如下:

  1: mysql> use ivm;
  2: Database changed
  3: mysql> show variables like '%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数据库中创建存储过程及调用结果如下:

  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: #下面的语句都执行失败,错误信息为:Data too long for column 'inStr' at row 1
 10: call r_test('中国');
 11: call r_test(_gbk'中国');
 12: SET @china = _gbk'中国';
 13: CALL r_test(@china);
 14: #执行成功 返回值是:latin1
 15: call r_test('china');
 16: 
 17: 
 18: # 创建存储过程中设置了 参数的字符集
 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: #执行成功 返回值是:gbk
 28: call r_test2('中国');
 29: #执行成功 即使执行前设置了字符集是utf8返回值仍然是:gbk
 30: call r_test2(_utf8'中国');
 31: #执行成功 返回值是:gbk
 32: call r_test2('china');
结论:创建存储过程时如果没有指定存储过程的参数的字符集,mysql总是认为当前的参数使用的是系统的字符集(windows 下 my.ini中的 default-character-set指定)。
否则,mysql总是认为存储过程的参数使用的就是定义时指定的字符集。
需要注意的是:上面的规则和当前的连接字符集没有任何的关系(使用mysql_options(m_pMySql, MYSQL_SET_CHARSET_NAME, "utf8")也不会改变)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值