求助mysql5.1中文乱码问题

sky663 2013-05-26 11:56:00
系统Centos
编码
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"


mysql> show variables like "%char%";
+--------------------------+----------------------------+
| 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)


原表数据正常utf8

mysql> select * from cep.temp1 limit 5;
+--------+-----------+
| code | name |
+--------+-----------+
| 110000 | 北京市 |
| 110100 | 市辖区 |
| 110101 | 东城区 |
| 110102 | 西城区 |
| 110105 | 朝阳区 |
+--------+-----------+
5 rows in set (0.00 sec)

数据复制后就乱码了。


mysql> insert into cep.area (code ,name) select code,name from cep.temp1;
Query OK, 3507 rows affected, 3507 warnings (0.15 sec)
Records: 3507 Duplicates: 0 Warnings: 0

mysql> select * from cep.area limit 5;
+--------+---------+-------+-------------+
| code | name | level | parent_code |
+--------+---------+-------+-------------+
| 0086 | Chinese | 1 | 0 |
| 640402 | ??? | NULL | NULL |
| 640401 | ??? | NULL | NULL |
| 640400 | ??? | NULL | NULL |
| 640381 | ???? | NULL | NULL |
+--------+---------+-------+-------------+
5 rows in set (0.00 sec)

两张表的编码也没问题。

show create table cep.temp1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| temp1 | CREATE TABLE `temp1` (
`code` varchar(8) NOT NULL,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


CREATE TABLE `area` (
`code` varchar(8) CHARACTER SET latin1 NOT NULL,
`name` varchar(32) CHARACTER SET latin1 DEFAULT NULL,
`level` char(1) CHARACTER SET latin1 DEFAULT NULL,
`parent_code` varchar(8) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

我都没有直接写入中字,它内部复制也会出现这种情况,真不搞不懂。
求大神指点指点啊……



...全文
237 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky663 2013-05-27
  • 打赏
  • 举报
回复
多谢各位大虾的帮助,问题已解决。 drop 表后重建就可以了。 原因分析: 这张area表,在建表时是默认的 latin1 编码。然后我在里面插入了中文数据,程序中发现取出是乱码后,直接对数据库及表 执行了alter 操作。 空表执行后没问题,这张表有中文的表不知是不是出于对数据的保护,还是保留了原来的编码储存,但其表参数中显示为修改后的utf8编码,导致我们误认为修改成功。
wwwwb 2013-05-27
  • 打赏
  • 举报
回复
去掉`area` 中的 CHARACTER SET latin1 CREATE TABLE `area` ( `code` varchar(8) CHARACTER SET latin1 NOT NULL, `name` varchar(32) CHARACTER SET latin1 DEFAULT NULL, `level` char(1) CHARACTER SET latin1 DEFAULT NULL, `parent_code` varchar(8) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
rucypli 2013-05-26
  • 打赏
  • 举报
回复
这个意思就是存储的确实是问号 数据复制后就乱码了 这个你是怎么复制的
sky663 2013-05-26
  • 打赏
  • 举报
回复
引用 3 楼 ACMAIN_CHM 的回复:
可能于客户端的操作系统有关。有些系统,比如WINDOWS的命令行窗口是不完整支持UTF8,但Centos 则需要检查一下。
我全部在Centos 上操作也是一样的结果啊
sky663 2013-05-26
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
另外 看输入到底是因为字符集显示的问题 还是确实是乱码 select hex(col1) from tb 如果是3F则确实是? 字符集没有转化过来
大哥,这还真是转化出了问题呀 mysql> select hex(name) from cep.temp1 limit 5; +--------------------+ | hex(name) | +--------------------+ | E58C97E4BAACE5B882 | | E5B882E8BE96E58CBA | | E4B89CE59F8EE58CBA | | E8A5BFE59F8EE58CBA | | E69C9DE998B3E58CBA | +--------------------+ 5 rows in set (0.00 sec) mysql> select hex(name) from cep.area limit 5; +----------------+ | hex(name) | +----------------+ | 4368696E657365 | | 3F3F3F | | 3F3F3F3F | | 3F3F3F3F | | 3F3F3F3F | +----------------+ 5 rows in set (0.00 sec) 大哥这种情况怎么解决呀?
ACMAIN_CHM 2013-05-26
  • 打赏
  • 举报
回复
可能于客户端的操作系统有关。有些系统,比如WINDOWS的命令行窗口是不完整支持UTF8,但Centos 则需要检查一下。
rucypli 2013-05-26
  • 打赏
  • 举报
回复
另外 看输入到底是因为字符集显示的问题 还是确实是乱码 select hex(col1) from tb 如果是3F则确实是? 字符集没有转化过来
rucypli 2013-05-26
  • 打赏
  • 举报
回复
主要是和你的客户端的字符集设置有关 set names utf8;或者set names gbk;试试 mysql> select * from cep.temp1 limit 5;
rucypli 2013-05-26
  • 打赏
  • 举报
回复
把area删掉 直接用temp1的表结构 create table area select * from temp1;
sky663 2013-05-26
  • 打赏
  • 举报
回复
原表不是乱码呀 mysql> select * from cep.temp1 limit 5; +--------+-----------+ | code | name | +--------+-----------+ | 110000 | 北京市 | | 110100 | 市辖区 | | 110101 | 东城区 | | 110102 | 西城区 | | 110105 | 朝阳区 | +--------+-----------+ 5 rows in set (0.00 sec) mysql> select hex(name) from cep.temp1 limit 5; +--------------------+ | hex(name) | +--------------------+ | E58C97E4BAACE5B882 | | E5B882E8BE96E58CBA | | E4B89CE59F8EE58CBA | | E8A5BFE59F8EE58CBA | | E69C9DE998B3E58CBA | +--------------------+ 5 rows in set (0.00 sec)
rucypli 2013-05-26
  • 打赏
  • 举报
回复
insert into cep.area (code ,name) select code,name from cep.temp1; 如果这样复制的是乱码 那复制的原表temp1肯定也是乱码
sky663 2013-05-26
  • 打赏
  • 举报
回复
唉,这mysql设计得好郁闷,我进去的是什么字节码,你就按这字节码存储就行了嘛,出来直接读出来就好了,为什么一定要转来转去的呀,你管用户输入的是什么编码的字串做什么。
sky663 2013-05-26
  • 打赏
  • 举报
回复
复制用这种: mysql> insert into cep.area (code ,name) select code,name from cep.temp1; Query OK, 3507 rows affected, 3507 warnings (0.15 sec) Records: 3507 Duplicates: 0 Warnings: 0

56,938

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧