免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3308 | 回复: 3
打印 上一主题 下一主题

Mysql 函数里面的中文汉字问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-12 21:43 |只看该作者 |倒序浏览
各位同仁,问题一直困扰了好久,希望在这里能有个答案:

mysql> show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

函数如下:
  1. DELIMITER $
  2. DROP FUNCTION IF EXISTS `freeagent`.`chs_test`$
  3. CREATE FUNCTION `chs_test`(seconds INT) RETURNS VARCHAR(255)
  4. BEGIN
  5.   DECLARE str VARCHAR(255) CHARACTER SET 'utf8';
  6.   SET str = '这是汉字';
  7.   RETURN str;
  8. END$
  9. DELIMITER ;
复制代码
将函数执行进去:
[root/tmp]# mysql -uroot -proot testdb < chtest.sql

1. 可以看到,client端的字符集是latin1,select一切正常
mysql> select chs_test(1)
    -> ;
+-------------+
| chs_test(1) |
+-------------+
| 这是汉字   |
+-------------+
1 row in set (0.00 sec)

2. 如果用utf8字符集,结果是乱码:
mysql> set names 'utf8';
Query OK, 0 rows affected (0.00 sec)

mysql>  show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql> select chs_test(1);
+------------------+
| chs_test(1)      |
+------------------+
| ÕâÊǺº×Ö |
+------------------+
1 row in set (0.00 sec)


3. 用gbk同样是乱码
mysql> set names 'gbk';
Query OK, 0 rows affected (0.00 sec)

mysql>  show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | gbk    |
| character_set_connection | gbk    |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | gbk    |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

mysql> select chs_test(1);
+-------------+
| chs_test(1) |
+-------------+
| ??????¡Á?   |
+-------------+
1 row in set (0.00 sec)


字符集到底应该怎么设置呢?貌似函数里面的中文不太好设置。我的经验是,在导入数据的时候客户端字符集用gbk,这样select的时候都能OK。
上面的函数我在往数据库执行的时候,尝试了utf8跟gbk都不work。

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-09-12 21:49 |只看该作者
我的database跟server的字符集都默认是utf8了,为啥client端跟他们一致起来的时候就得到乱码,用latin1反而不乱呢?
还有个方法问题,如果是函数里面有中文,这样在linux下函数我用上述方法执行进数据库,应该没问题吧?
谢谢

论坛徽章:
0
3 [报告]
发表于 2010-09-12 22:26 |只看该作者
mysql服务器是否支持utf,gbk呢?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
4 [报告]
发表于 2010-09-13 09:25 |只看该作者
那是因为你导入时的客户端连接字符集不对,用的是latin,导致function导入的时候中文就已经是以latin字符集存储的了。 最终之所以能用latin字符集看到正确的中文,是错进错出的结果。
建议导入的时候强制设定字符集
mysql --default-character-set=utf8 -uroot -proot testdb < chtest.sql
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP