特殊字符的编码问题Latin1-->GBK(看了精华帖,没找到解决的)

godphoenix 2010-06-11 03:26:26
这两天我处理一个项目,要把原来4.0.27的库(字符为latin1)的资料转成mysql5.1.46(编码为GBK)

通过以下命令,先导出源数据

mysqldump -uXXX -pXXX -q --default-character-set=latin1 databasename > data.sql

然后到mysql5环境下,查看变量和环境,如下:

Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk

mysql> show variables like '%conn%';
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| character_set_connection | gbk |
| collation_connection | gbk_chinese_ci |


mysql> show variables like '%colla%';
+----------------------+----------------+
| Variable_name | Value |
+----------------------+----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | gbk_chinese_ci |
| collation_server | gbk_chinese_ci |
+----------------------+----------------+

mysql> show variables like '%chara%';
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |

mysql> create database databasename default character set gbk collate gbk_chinese_ci;

mysql>source data.sql;

========================
结果查看结果时,发现有一些存在特殊字符的中文记录(例如:全角空格),就被截成 '',或有一些特殊字符就变成另外的模样。不知道这个问题怎么解决!烦请高手查看一下,帮忙告知如何处理




另外,我从网上搜到一位仁兄似乎也遇到与我一样的问题(没找到答案):

========================================
我的网站以前使用Mysql默认字符集Latin1,其中有以下用户
'_LINぷNA_'
'_冬ぷ冬_'
'yun'
'╮静茹╭'
'╰╮如云╭╯'
'随风'
这些用户名称目前可正常使用(在Latin1字符集数据库中)

现在我想将数据库转换为gbk字符集,发现上述用户名无法插入数据库,不是被截掉部分内容,就是全部清空。

比如 'yun' 录入后,只有 'yun',
比如 '╮静茹╭' 录入后,字段内容为空。

为什么?

可以解决么?
========================================
...全文
817 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
godphoenix 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 yh801216 的回复:]
楼主,有一个问题你忽略了。这些数据你之前存入数据库中是什么编码。
[/Quote]


之前的编码,就是用--default-character-set=latin1导出的来sql,用文本工具打开都是正常显示的。我也用UE直接把文件里的编码都改成UTF8,但导入数据库后数据更是莫名其妙的东东。比不转码还差。。。
「已注销」 2010-06-13
  • 打赏
  • 举报
回复
也许这个问题是很多人的疑问,主要的问题是没有仔细想流程中的细节:
latin1 它不支持中文等多字节字符的。多字节字符在latin1就相当于二进制的数据。

楼主说的转utf8也很悲剧,那是因为你忘记了参考这些数据使用环境了。
如果这些数据是gbk编码存到数据库中的,那么你要从gbk转到utf8。
如果是gbk转latin1存到数据库中,那么你要转utf8怎么做呢?

关键问题:
1 从插入数据sql--数据库中间过程处理数据--存储 这个全过程,所谓的编码起到什么样的作用
2 输入数据--存储数据--输出数据 过程中 如何分析,还原数据。
3 看字符串16进制值

相信列了这些问题,稍有点底子应该都能自己搞定,不用再找人解答了
zzk5566 2010-06-13
  • 打赏
  • 举报
回复
学习了。。。
「已注销」 2010-06-13
  • 打赏
  • 举报
回复
楼主,有一个问题你忽略了。这些数据你之前存入数据库中是什么编码。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 godphoenix 的回复:]

这样吧。我把有问题的字符记录和data.sql的信息帖上来。

-- MySQL dump 10.13 Distrib 5.1.46, for Win32 (ia32)
--
-- Host: localhost Database: cnyx
-- ------------------------------------------------------
-- Server……
[/Quote]

/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

这些 40103 40104 之类的是什么意思啊。
大家帮忙看下这个帖子:http://topic.csdn.net/u/20100612/19/c743f803-6071-4291-878f-eedf89e7f365.html
godphoenix 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yh801216 的回复:]


楼主说的转utf8也很悲剧,那是因为你忘记了参考这些数据使用环境了。
如果这些数据是gbk编码存到数据库中的,那么你要从gbk转到utf8。
如果是gbk转latin1存到数据库中,那么你要转utf8怎么做呢?

[/Quote]

===
新手上路,有些地方还是想不明白。
转UTF8的编码也是用一样的方法。用mysqldump --default-character-set=latin1 导出sql文件后,插入到使用UTF8的数据库。连接也以UTF8来进行的(难道这里的连接要使用Latin1?)
iihero_ 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 loveflea 的回复:]

latin1应该就是ascii, gbk应该都包含的!
[/Quote]
ascii码是没错,但是在转码gbk的时候,对应的是双字节值,并不是所有的双字节值都有对应的gbk值。这就是问题所在。
loveflea 2010-06-12
  • 打赏
  • 举报
回复
latin1应该就是ascii, gbk应该都包含的!
godphoenix 2010-06-12
  • 打赏
  • 举报
回复
那就是说除去针对特殊字符换值。基本上没别的招了?
iihero_ 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 loveflea 的回复:]

这样试一试呢!
mysql> set names gbk;
mysql> create database databasename default character set gbk collate gbk_chinese_ci;
mysql> use databasename;
mysql> set names latin1;
mysql> source data.sql;
mys……
[/Quote]
这样是不行的。特殊字符还是转换不了。
楼主的根本问题在于使用latin1描述了一些在gbk中根本不存在的字符。
所以, 要不就特殊处理,要不就得针对那列换值。
loveflea 2010-06-12
  • 打赏
  • 举报
回复
这样试一试呢!
mysql> set names gbk;
mysql> create database databasename default character set gbk collate gbk_chinese_ci;
mysql> use databasename;
mysql> set names latin1;
mysql> source data.sql;
mysql> set names gbk;
trainee 2010-06-12
  • 打赏
  • 举报
回复
我测试过了
‘╮静茹╭’ 是gbk玛,没问题
‘等彳寺氵肖逝’ 前面一个字会变成问号??
  • 打赏
  • 举报
回复
先mark下。
我也碰到了,msql数据库4.x就会出现这个问题,5.x就不会。
godphoenix 2010-06-12
  • 打赏
  • 举报
回复
如果是替换,把那么多特殊的记录找出来,也是一件非常艰难的事。我只贴了一张表出来,同样的还有N张表的数据啊。而且都不少的,造孽的字符转换啊!!
iihero_ 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 godphoenix 的回复:]

可是我要转成UTF8时。也是一样的悲剧啊。特殊字符搞死人。如果用Latin1的方式写入GBK的库,再用Latin1的连接读出来,显示是正常。但这不是我想要的结果。
[/Quote]
长痛不如短痛,你可以先将那些特殊字符替换一下。
估计是一些注册用户信息吧。
godphoenix 2010-06-12
  • 打赏
  • 举报
回复
可是我要转成UTF8时。也是一样的悲剧啊。特殊字符搞死人。如果用Latin1的方式写入GBK的库,再用Latin1的连接读出来,显示是正常。但这不是我想要的结果。
godphoenix 2010-06-11
  • 打赏
  • 举报
回复
data.sql的后段

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
godphoenix 2010-06-11
  • 打赏
  • 举报
回复
这样吧。我把有问题的字符记录和data.sql的信息帖上来。

-- MySQL dump 10.13 Distrib 5.1.46, for Win32 (ia32)
--
-- Host: localhost Database: cnyx
-- ------------------------------------------------------
-- Server version 4.0.27-nt-log
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `cq_user_1`
--

DROP TABLE IF EXISTS `cq_user_1`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8*/;
CREATE TABLE `cq_user_1` (
`id` int(4) unsigned NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;

/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `cq_user_1`
--

INSERT INTO `cq_user_1` VALUES (100145152,'等彳寺氵肖逝');
INSERT INTO `cq_user_1` VALUES (101072545,'①嗰亽跳儛');

===========================

检查结果:
1、
mysql> show create table cq_user_1\G;
*************************** 1. row ***************************
Table: cq_user_1
Create Table: CREATE TABLE `cq_user_1` (
`id` int(4) unsigned NOT NULL DEFAULT '0',
`name` varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
2
mysql> show full columns from cq_user_1;
+------------+---------------------+----------------+------+-----+---------
| Field | Type | Collation | Null | Key | Default
+------------+---------------------+----------------+------+-----+---------
| id | int(4) unsigned | NULL | NO | PRI | 0
| name | varchar(64) | gbk_chinese_ci | NO | |
+------------+---------------------+----------------+------+-----+---------

3、
mysql> show variables like 'char%';
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | d:\mysql_5.1.46\share\charsets\ |
+--------------------------+---------------------------------+
ACMAIN_CHM 2010-06-11
  • 打赏
  • 举报
回复
参考下贴,贴出你的检查结果。

http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
MySQL 中文显示乱码


现在综合你的情况,怀疑你表中存储的不是GBK的编码。

如果是MYISAM的表,建议你上传一下。

可以上传到 http://www.access911.net/csdn
godphoenix 2010-06-11
  • 打赏
  • 举报
回复
回楼上:

用字符编辑程序(比如UE)修改data.sql 中的对象创建字符集为 gbk。
==
是指把sql中的
/*!40101 SET character_set_client = utf8*/
改成GBK么?已经改过了,无效。


建议可以试试将data.sql 的编码方式该为utf8 , 修改方法为:在data.sql 的头部加入十六进制的 0xFFFE , 就2个字节。
==这个我用UE打开data.sql文件,然后用转换功能,ASCII到UTF8(Unicode编辑)。转换过,可是导入还是乱码。
加载更多回复(4)

56,678

社区成员

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

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