也谈MySQL4.0升到4.1的中文乱码问题
时间:2007-02-17 来源:PHP爱好者
我想大家都会遇到这个问题。
大概有几百MB的数据需要导。
比如你使用mysqldump导出来的数据要放到一个4.1那么我觉得有两个方法:
首先你把你的mysql 4.1设置成为gb2312字符集
然后你把要导的文件打开把里面的CREATE语法加一句
CREATE TABLE sss(
zxxxxxx
) CHARACTER SET BINARY;
这样,当你导到新库里的时候CHAR VARCHAR自己会变成VARBINARY,然后你再修改成为gb2312
这样也有一个缺点,如果你表很多并且可能会因此影响性能。那你就要一个一个字段修改。
我建议你把文件里CREATE TABLE 的CHAR结构变为BINARY而VARCHAR变为VARBINARY这样你要修改回来还知道怎么修改。
总知,导之前先变成BINARY之后再改就好了。
hot_ice 回复于:2004-12-02 15:07:05我报告给mysql
SELECT INTO OUTFILE
If the filename includes chinese charactor, it's changed
If the pathname includes chinese charactor, it's can't find the path name
LOAD DATA
can recognize the orignal filename which I type in Select statement
can't recognize the orignal pathname which I type in Select statement
How to repeat:
E:dbbin>mysqld-max-nt.exe --console
mysql> select * from aa;
+------+--------+
| a | b |
+------+--------+
| 1 | 111.11 |
+------+--------+
1 row in set (0.04 sec)
mysql> select * from aa into outfile 'e:/db/aa.txt';
Query OK, 1 row affected (0.00 sec)
mysql> select * from aa into outfile 'e:/db/中文.txt';
Query OK, 1 row affected (0.00 sec)
but the file name be changed to '脰脨脦脛.txt'
mysql> select * from aa into outfile
'e:/db/新文件夹/中文.txt';
ERROR 1 (HY000): Can't create/write to file
'e:db脨脗脦脛录镁录脨脰
脨脦脛.txt
' (Errcode: 2)
mysql> load data infile 'e:/db/aa.txt' into table aa;
Query OK, 1 row affected (0.02 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile 'e:/db/中文.txt' into table aa;
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile
'e:/db/新文件夹/中文.txt' into table aa;
ERROR 1105 (HY000): File
'e:db脨脗脦脛录镁录脨脰
脨脦脛.txt' not found (Errcod
e: 2)
Suggested fix:
4.0.21 and earlier is ok
他们的回复
------------------------------------------------------------------------
[2004-10-29 09:45:04] Sinisa Milivojevic
Currently, MySQL does not support filenames in some of multi-byte
character sets.
This is a problem that is caused by multi-byte char sequences
containing a backslash.
This is scheduled to be fixed in 5.1.
hoowa 回复于:2004-12-07 16:22:45我的表名称是英文的,另外使用mysqlimport导入所以文件名也是英文。
所以没遇到你这个问题。
谢谢赐教!
haoyufu 回复于:2004-12-10 16:28:16l楼上大兄地我 也于语见了此文题请高手之点啊
水若寒 回复于:2004-12-15 23:46:56有没有彻底解决4.1中文乱码的问题?!
对原来的数据,一定要先从4.0导出,然后改动,再导入吗?
那么在4.1里新建库或表呢?要怎样做才不至于中文乱码?
hoowa 回复于:2004-12-16 08:24:34如果是新建的就不会有问题。旧版导入一定会有问题。
4.0 4.1的存储算法可能有不同。
另外,你还要考虑到目前大部分的mysqlclient都不支持4.1
升级其实是一种危险。 系统越庞大危险程度越高。
比如PHP Perl 等等都要更换MySQLClient的库
水若寒 回复于:2004-12-16 13:23:04.是啊,所以是否要升级还是要深思啊。
很多基于4.0的PHP程序也许会因此而无法正常使用了
platinum 回复于:2005-01-10 07:55:58而且无论如何调,在phpMyadmin里看到的永远都是乱码
hoowa 回复于:2005-01-10 09:14:08to platinum
mysql4.1里还要设置client端采用的encode 如果跟server端不一样,就出乱码了。
这个问题,我在mysql官方的mysql query browser工具使用的时候才不出。
所以,大家还是慎重更换吧。有成熟的方案之前,谨慎升级
platinum 回复于:2005-01-10 15:04:28是的,我很后悔升级
而且还有一个问题,发现只能升级,不能降级,4.1.X的数据在4.0.X中无法导入
hoowa 回复于:2005-01-10 16:32:24我现在只发现了mysql4.1的中文fulltext 技术改进了。
其他的,我还没太注意。可能跟我关系不大。
我没敢升级。呵呵
Surran 回复于:2005-02-11 00:47:19我现在是存中文变乱码,以前的记录倒是可以显示了,虽然也存在很多问题。
通过phpMyAdmin添加或者修改后就可以正常显示,但是一旦通过我自己编写的页面进行了操作,马上就会又变成乱码。
很烦人。
shen_zq 回复于:2005-02-21 21:17:00老天呀,5.1
xxanadu 回复于:2005-02-22 11:29:14我用的是4.1.7,4.1.8,4.1.9,
如里在4.1.X内升版,只需要将你的DB 所在的目录复制到MySQL_DATA目录下即可。
我前端是JAVA WEB 应用,建库时,用的字符集是 lartin -1, 这样在我的应用前端输入也好,输出也好,都没问题!
但有一个问题:我的WINDOWS系统是英文的,MySQL Admin的备份只支持 SQL 文件备份, 生成的sql文件中的中文全是乱码, 如果往回导入根本是不可能的。
MySQL 能否自己提供二进制级的数据库备份呢?
qwent 回复于:2005-03-03 13:13:29稳定就好了
sasal 回复于:2005-03-03 16:37:31mysql4.1以后的密码加密都变化了。最重要的是,好像mysql对中文的支持天生存在缺陷!连中文参考手册都没有。
gamester 回复于:2005-03-03 18:04:26绕个弯可以吧?用程序读出表中的内容,再写到新表中去。
将两套mysql安装到不同的端口,然后先连接到老版,读出数据,再写到新版的中去,我感觉上这样应该可以的,但没试过:)
mcpba 回复于:2005-03-07 21:54:21我输入中文,无论怎么设置字符集,都是乱码555
chinsa 回复于:2005-03-07 23:25:41easy way, do a dump file from 4.0 and load into 4.1
boyboys 回复于:2005-03-08 20:45:45还好我备份了数据库,我不我死定了。那些会员非跟我玩命的
rhinux 回复于:2005-03-17 12:12:57[quote:6dbb2c8dc4="chinsa"]easy way, do a dump file from 4.0 and load into 4.1[/quote:6dbb2c8dc4]
我就是这样做的,全乱了....我编译的时候就选了gb2312,无论在my.cnf 怎么改,只有在本地可以用
hoowa 回复于:2005-04-27 10:31:11我就奇怪,怎么没有对mysql 4.0 4.1 5.x类数据库的数据转换工具呢。
市场有这需要啊。
winddss 回复于:2005-05-31 10:03:50大家有没有看过mysqldump的help
只要加上 --compatible=mysql40 就可以生成兼容mysql 4.0.x的数据库脚本,这个是不存在中文乱码问题的,同样也可在4.1版的mysql中正确导入。
冷风 回复于:2005-06-06 22:11:56我一直都是备份mysql的数据库目录来备份的,最近一次升级从3.23升级到4.1.10a,没有出现乱码问题,数据量>1g,你们都是用mysqldump来备份的?
lares 回复于:2005-06-07 01:04:51导入时如果是命令行模式导, 默认都是UTF-8编码格式导的,所以无论怎么样都会出现乱码,你加一行指定特定字符一般就OK了
--default-character-set=gb2312
导出可以用phpmyadmin, 选择导出的兼容格式, 选mysql3.x以前的格式导出就OK了~可以兼容mysql4.0的,可能执行的相应命令就是楼上兄台提到的 --compatible=mysql40 之类, 呵呵:)
lares 回复于:2005-06-07 01:05:41[quote:7489fad6ee="冷风"]我一直都是备份mysql的数据库目录来备份的,最近一次升级从3.23升级到4.1.10a,没有出现乱码问题,数据量>1g,你们都是用mysqldump来备份的?[/quote:7489fad6ee]
没有出现问题? 真奇怪!!!
ttvast 回复于:2005-06-07 14:32:59我真孤陋寡闻,我第一次知道别人是通过mysqldump在mysql数据库间迁移数据的:(
print 回复于:2005-06-07 17:09:29汗,这个问题捆扰我三四天..后来用的phpmyadmin2.4导入.sql文件就搞定了.,反正凑合着吧...
flw 回复于:2005-06-13 16:29:46我今天又开始用4.1了因为我需要用:(
说说几个问题:
1、提示协议不对,用mysql的old_password函数把相关用户密码修改既可或是重新编译新的头文件(不论哪个语言)。
2、关于编码,如果用各种语言取得的数据是乱码或插入的是乱码请用set names gbk 或则gb2312来修整。但是这种set 只在当前session有效,就是说如果你disconnect下次还要设置一次。别的方法不讲了。
3、数据如果要从4.1导回4.0请参考楼上那兄弟使用mysqldump加一个兼容的参数既可。
我还在找从4.0的mysqldump数据到4.1的非latin编码的表出现乱码的其他方法。
flw 回复于:2005-06-13 16:43:07找到了。
你把mysqldump出来的数据修改一下。除了要把表增加上) TYPE=MyISAM CHARACTER SET gbk;以外,在下面再增加一句SET NAMES GBK;
这样,数据就可以平滑的导入4.1了,而不必怕出现乱码。
win1699 回复于:2005-06-14 08:28:28[quote:cc2fa96e67="hoowa"]to platinum
mysql4.1里还要设置client端采用的encode 如果跟server端不一样,就出乱码了。
这个问题,我在mysql官方的mysql query browser工具使用的时候才不出。
所以,大家还是慎重更换吧。有成熟的方案之..........[/quote:cc2fa96e67]
官方这工具是中文件的吗?
下载地址是什么?
hoowa 回复于:2005-06-14 21:07:34就在www.mysql.com可以看到,查询管理器嘛!
mysql-front也可以看到要在client设置set names gbk就可以了。但是注意不能insert有中文的数据,只能看。
thunderx 回复于:2005-08-22 10:52:27[quote:aef1490a87="platinum"]是的,我很后悔升级
而且还有一个问题,发现只能升级,不能降级,4.1.X的数据在4.0.X中无法导入[/quote:aef1490a87]
呵呵,可以导入的,但需要把语句里的engine=mysql改成Type=MyIsam就OK了!
php爱好者站 http://www.phpfans.net 为phper提供一切资讯.
大概有几百MB的数据需要导。
比如你使用mysqldump导出来的数据要放到一个4.1那么我觉得有两个方法:
首先你把你的mysql 4.1设置成为gb2312字符集
然后你把要导的文件打开把里面的CREATE语法加一句
CREATE TABLE sss(
zxxxxxx
) CHARACTER SET BINARY;
这样,当你导到新库里的时候CHAR VARCHAR自己会变成VARBINARY,然后你再修改成为gb2312
这样也有一个缺点,如果你表很多并且可能会因此影响性能。那你就要一个一个字段修改。
我建议你把文件里CREATE TABLE 的CHAR结构变为BINARY而VARCHAR变为VARBINARY这样你要修改回来还知道怎么修改。
总知,导之前先变成BINARY之后再改就好了。
hot_ice 回复于:2004-12-02 15:07:05我报告给mysql
SELECT INTO OUTFILE
If the filename includes chinese charactor, it's changed
If the pathname includes chinese charactor, it's can't find the path name
LOAD DATA
can recognize the orignal filename which I type in Select statement
can't recognize the orignal pathname which I type in Select statement
How to repeat:
E:dbbin>mysqld-max-nt.exe --console
mysql> select * from aa;
+------+--------+
| a | b |
+------+--------+
| 1 | 111.11 |
+------+--------+
1 row in set (0.04 sec)
mysql> select * from aa into outfile 'e:/db/aa.txt';
Query OK, 1 row affected (0.00 sec)
mysql> select * from aa into outfile 'e:/db/中文.txt';
Query OK, 1 row affected (0.00 sec)
but the file name be changed to '脰脨脦脛.txt'
mysql> select * from aa into outfile
'e:/db/新文件夹/中文.txt';
ERROR 1 (HY000): Can't create/write to file
'e:db脨脗脦脛录镁录脨脰
脨脦脛.txt
' (Errcode: 2)
mysql> load data infile 'e:/db/aa.txt' into table aa;
Query OK, 1 row affected (0.02 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile 'e:/db/中文.txt' into table aa;
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile
'e:/db/新文件夹/中文.txt' into table aa;
ERROR 1105 (HY000): File
'e:db脨脗脦脛录镁录脨脰
脨脦脛.txt' not found (Errcod
e: 2)
Suggested fix:
4.0.21 and earlier is ok
他们的回复
------------------------------------------------------------------------
[2004-10-29 09:45:04] Sinisa Milivojevic
Currently, MySQL does not support filenames in some of multi-byte
character sets.
This is a problem that is caused by multi-byte char sequences
containing a backslash.
This is scheduled to be fixed in 5.1.
hoowa 回复于:2004-12-07 16:22:45我的表名称是英文的,另外使用mysqlimport导入所以文件名也是英文。
所以没遇到你这个问题。
谢谢赐教!
haoyufu 回复于:2004-12-10 16:28:16l楼上大兄地我 也于语见了此文题请高手之点啊
水若寒 回复于:2004-12-15 23:46:56有没有彻底解决4.1中文乱码的问题?!
对原来的数据,一定要先从4.0导出,然后改动,再导入吗?
那么在4.1里新建库或表呢?要怎样做才不至于中文乱码?
hoowa 回复于:2004-12-16 08:24:34如果是新建的就不会有问题。旧版导入一定会有问题。
4.0 4.1的存储算法可能有不同。
另外,你还要考虑到目前大部分的mysqlclient都不支持4.1
升级其实是一种危险。 系统越庞大危险程度越高。
比如PHP Perl 等等都要更换MySQLClient的库
水若寒 回复于:2004-12-16 13:23:04.是啊,所以是否要升级还是要深思啊。
很多基于4.0的PHP程序也许会因此而无法正常使用了
platinum 回复于:2005-01-10 07:55:58而且无论如何调,在phpMyadmin里看到的永远都是乱码
hoowa 回复于:2005-01-10 09:14:08to platinum
mysql4.1里还要设置client端采用的encode 如果跟server端不一样,就出乱码了。
这个问题,我在mysql官方的mysql query browser工具使用的时候才不出。
所以,大家还是慎重更换吧。有成熟的方案之前,谨慎升级
platinum 回复于:2005-01-10 15:04:28是的,我很后悔升级
而且还有一个问题,发现只能升级,不能降级,4.1.X的数据在4.0.X中无法导入
hoowa 回复于:2005-01-10 16:32:24我现在只发现了mysql4.1的中文fulltext 技术改进了。
其他的,我还没太注意。可能跟我关系不大。
我没敢升级。呵呵
Surran 回复于:2005-02-11 00:47:19我现在是存中文变乱码,以前的记录倒是可以显示了,虽然也存在很多问题。
通过phpMyAdmin添加或者修改后就可以正常显示,但是一旦通过我自己编写的页面进行了操作,马上就会又变成乱码。
很烦人。
shen_zq 回复于:2005-02-21 21:17:00老天呀,5.1
xxanadu 回复于:2005-02-22 11:29:14我用的是4.1.7,4.1.8,4.1.9,
如里在4.1.X内升版,只需要将你的DB 所在的目录复制到MySQL_DATA目录下即可。
我前端是JAVA WEB 应用,建库时,用的字符集是 lartin -1, 这样在我的应用前端输入也好,输出也好,都没问题!
但有一个问题:我的WINDOWS系统是英文的,MySQL Admin的备份只支持 SQL 文件备份, 生成的sql文件中的中文全是乱码, 如果往回导入根本是不可能的。
MySQL 能否自己提供二进制级的数据库备份呢?
qwent 回复于:2005-03-03 13:13:29稳定就好了
sasal 回复于:2005-03-03 16:37:31mysql4.1以后的密码加密都变化了。最重要的是,好像mysql对中文的支持天生存在缺陷!连中文参考手册都没有。
gamester 回复于:2005-03-03 18:04:26绕个弯可以吧?用程序读出表中的内容,再写到新表中去。
将两套mysql安装到不同的端口,然后先连接到老版,读出数据,再写到新版的中去,我感觉上这样应该可以的,但没试过:)
mcpba 回复于:2005-03-07 21:54:21我输入中文,无论怎么设置字符集,都是乱码555
chinsa 回复于:2005-03-07 23:25:41easy way, do a dump file from 4.0 and load into 4.1
boyboys 回复于:2005-03-08 20:45:45还好我备份了数据库,我不我死定了。那些会员非跟我玩命的
rhinux 回复于:2005-03-17 12:12:57[quote:6dbb2c8dc4="chinsa"]easy way, do a dump file from 4.0 and load into 4.1[/quote:6dbb2c8dc4]
我就是这样做的,全乱了....我编译的时候就选了gb2312,无论在my.cnf 怎么改,只有在本地可以用
hoowa 回复于:2005-04-27 10:31:11我就奇怪,怎么没有对mysql 4.0 4.1 5.x类数据库的数据转换工具呢。
市场有这需要啊。
winddss 回复于:2005-05-31 10:03:50大家有没有看过mysqldump的help
只要加上 --compatible=mysql40 就可以生成兼容mysql 4.0.x的数据库脚本,这个是不存在中文乱码问题的,同样也可在4.1版的mysql中正确导入。
冷风 回复于:2005-06-06 22:11:56我一直都是备份mysql的数据库目录来备份的,最近一次升级从3.23升级到4.1.10a,没有出现乱码问题,数据量>1g,你们都是用mysqldump来备份的?
lares 回复于:2005-06-07 01:04:51导入时如果是命令行模式导, 默认都是UTF-8编码格式导的,所以无论怎么样都会出现乱码,你加一行指定特定字符一般就OK了
--default-character-set=gb2312
导出可以用phpmyadmin, 选择导出的兼容格式, 选mysql3.x以前的格式导出就OK了~可以兼容mysql4.0的,可能执行的相应命令就是楼上兄台提到的 --compatible=mysql40 之类, 呵呵:)
lares 回复于:2005-06-07 01:05:41[quote:7489fad6ee="冷风"]我一直都是备份mysql的数据库目录来备份的,最近一次升级从3.23升级到4.1.10a,没有出现乱码问题,数据量>1g,你们都是用mysqldump来备份的?[/quote:7489fad6ee]
没有出现问题? 真奇怪!!!
ttvast 回复于:2005-06-07 14:32:59我真孤陋寡闻,我第一次知道别人是通过mysqldump在mysql数据库间迁移数据的:(
print 回复于:2005-06-07 17:09:29汗,这个问题捆扰我三四天..后来用的phpmyadmin2.4导入.sql文件就搞定了.,反正凑合着吧...
flw 回复于:2005-06-13 16:29:46我今天又开始用4.1了因为我需要用:(
说说几个问题:
1、提示协议不对,用mysql的old_password函数把相关用户密码修改既可或是重新编译新的头文件(不论哪个语言)。
2、关于编码,如果用各种语言取得的数据是乱码或插入的是乱码请用set names gbk 或则gb2312来修整。但是这种set 只在当前session有效,就是说如果你disconnect下次还要设置一次。别的方法不讲了。
3、数据如果要从4.1导回4.0请参考楼上那兄弟使用mysqldump加一个兼容的参数既可。
我还在找从4.0的mysqldump数据到4.1的非latin编码的表出现乱码的其他方法。
flw 回复于:2005-06-13 16:43:07找到了。
你把mysqldump出来的数据修改一下。除了要把表增加上) TYPE=MyISAM CHARACTER SET gbk;以外,在下面再增加一句SET NAMES GBK;
这样,数据就可以平滑的导入4.1了,而不必怕出现乱码。
win1699 回复于:2005-06-14 08:28:28[quote:cc2fa96e67="hoowa"]to platinum
mysql4.1里还要设置client端采用的encode 如果跟server端不一样,就出乱码了。
这个问题,我在mysql官方的mysql query browser工具使用的时候才不出。
所以,大家还是慎重更换吧。有成熟的方案之..........[/quote:cc2fa96e67]
官方这工具是中文件的吗?
下载地址是什么?
hoowa 回复于:2005-06-14 21:07:34就在www.mysql.com可以看到,查询管理器嘛!
mysql-front也可以看到要在client设置set names gbk就可以了。但是注意不能insert有中文的数据,只能看。
thunderx 回复于:2005-08-22 10:52:27[quote:aef1490a87="platinum"]是的,我很后悔升级
而且还有一个问题,发现只能升级,不能降级,4.1.X的数据在4.0.X中无法导入[/quote:aef1490a87]
呵呵,可以导入的,但需要把语句里的engine=mysql改成Type=MyIsam就OK了!
php爱好者站 http://www.phpfans.net 为phper提供一切资讯.
相关阅读 更多 +