字符集崩溃了。。。

missing77 2010-03-15 05:34:51
my.ini中设置过utf8 GB2312 GBK 并重启服务,重新建库,用户程序中还是一个汉字对应一个问号。。比较恶心的是应用程序没有源码,我改不了的。原来是用的mysql 3.2一切正常,现在换成mysql5.1就这样了。。
本人对mysql实在是没有经验,搞得头晕了。。老大们出手兄弟一把啊。。我要用触发器。。只能换5.1了。。

在下面的环境下,什么都不改,select Name from t1 是正常的中文,如果set names 'gb2312'或 GBK 时用select 全是不显示。各位帮看下错在哪里了。



mysql>show create table T1;
.....
.....省去数十行。。
ENGINE=MyISAM DEFAULT CHARSET=gb2312 |
--------------------------------------------


mysql>show variables like '%char%';
+--------------------------+-------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | gb2312 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | gb2312 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL Server 5.1\share\charsets\ |
+--------------------------+-------------------------------------+
8 rows in set


-------------------------------
mysql>show full columns from t1;
.......省去数十行。。
| Name | varchar(7) | gb2312_bin | NO | | | | select,insert,update,references |

(这里gb2312_bin 改成过 gb2312_chinese_ci 也不行 )

-----------------
my.ini
[client]

port=3306
default-character-set=gb2312
init_connect='set names gb2312'
character_set_results=gb2312

[mysql]

default-character-set=gb2312
character_set_results=gb2312


[mysqld]

port=3306
init_connect='set names gb2312'
character_set_server=gb2312
character_set_client=gb2312
basedir="C:/MySQL Server 5.1/"
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"
default-character-set=gb2312
default-storage-engine=myisam
log=sql.log
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=26M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=52M
key_buffer_size=40M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=77M
innodb_log_file_size=39M
innodb_thread_concurrency=8

——————————————
my.ini里没设置utf8,可是环境变量里却有。。字段是gb2312的,用gb2312却不显示字,用utf8倒能显示。。为什么。。。
>.<

...全文
120 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
missing77 2010-03-17
  • 打赏
  • 举报
回复
问题全部解决,非常感谢ACMAIN_CHM版主的无私帮助!
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
3.2 下你存的应该是 latin1 的字符编码。
现在关键要看你导入后的实际编码是什么,确认后则可以进行转换。
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 acmain_chm 的回复:]
两种情况下
乱码情况下,和不乱码情况下。
[/Quote]
是一样的。

另外我想问题是不是出在我库的导出和导入上面,3.2下这个字段是varchar(16) binary 在5.1下是varchar(16) 可是我改不成varchar(16) binary 有什么办法能在5.1下建个列为varchar(16) binary?我想试一下这样会不会正常。




sjzzy 2010-03-16
  • 打赏
  • 举报
回复
也总遇到字符集问题,学习一下
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
两种情况下
乱码情况下,和不乱码情况下。
missing77 2010-03-16
  • 打赏
  • 举报
回复
3.2中name字段是 varchar 二进位 导入5.1中二进位就没有了。是不是跟这个有关系?在5.1中我试着建了一个字段,选 择二进位,但建完后“二进位”的勾还是没有。怎么才能在5.1下建二进位的字段。。
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 acmain_chm 的回复:]
两种情况下提供一下你的

select hex(name),name from T1 where ....

应该是你的name 字段中存储的字符并不是GB2312 , 贴出结果具体分析后再找出如何处理。
[/Quote]
在5.1中结果如下:
CDF5C0DA 王磊
C0EED0C2 李欣

在3.2中结果如下:
0 王磊
0 李欣

3.2的正常显示,5.1的是问号。
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
两种情况下提供一下你的

select hex(name),name from T1 where ....

应该是你的name 字段中存储的字符并不是GB2312 , 贴出结果具体分析后再找出如何处理。
WWWWA 2010-03-16
  • 打赏
  • 举报
回复
你应该用MYSQL自己的MYSQLDUMP来导入、导出,估计在导入5。X版本时出问题了
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwwb 的回复:]
4。X上才有字符集,你在转换成5。X时,设置字符集没有?
[/Quote]
我是先把5.1的my.ini改为gb2312 或 GBK 然后重启服务,然后将3.2的库文件直接复制到5.1下面。
另外试过用N8的导出,导出为sql脚本无法在5.1上运行,后来转成access文件,可以导入到5.1里。

我对比了一下3.2时name字段有个“二进位”,转入5.1后,"二进位"这个勾选不上,选上就没。

用mysql自带的导出工具导出后不能正在常5.1里运行。
WWWWA 2010-03-16
  • 打赏
  • 举报
回复
字符集没有统一,
SET NAMES UTF8,在新字符集下重新插入记录
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
什么都不改,select Name from t1 是正常的中文
此时的 show variables like '%char%'; 结果是什么?
[/Quote]
此时char%就是我上面贴的。
+--------------------------+-------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | gb2312 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | gb2312 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL Server 5.1\share\charsets\ |
+--------------------------+-------------------------------------+
8 rows in set
wwwwb 2010-03-16
  • 打赏
  • 举报
回复
4。X上才有字符集,你在转换成5。X时,设置字符集没有?
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
长度的限制。所有需要一个字一个字依次取出处理。
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 acmain_chm 的回复:]
FFFFFFB4FFFFFFF3 得到 B4F3 然后可以直接 char(0xB4F3) 得到 大

依次取出所有的汉字,生成新的字符串,在触发器中 set new.name = char(0xB4F3CDB7) ,不过要注意对非汉字字符的处理,比较英文和数字,需要判断一下。
[/Quote]

感谢版主,其本差不多了。但又有个小问题请教一下:
比如我的数据是 “大头人”
用:select char(0xB4F3CDB7C8CB) 显示 "头人" 。。。最前面的“大”字不显示。
我转换成10进制也是一样的。这是什么原因?要如何解决?
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
FFFFFFB4FFFFFFF3 得到 B4F3 然后可以直接 char(0xB4F3) 得到

依次取出所有的汉字,生成新的字符串,在触发器中 set new.name = char(0xB4F3CDB7) ,不过要注意对非汉字字符的处理,比较英文和数字,需要判断一下。
missing77 2010-03-16
  • 打赏
  • 举报
回复
多谢版主提示,。。可是如何能把‘FFFFFFB4FFFFFFF3FFFFFFCDFFFFFFB7’变成 B4F3CDB7?
如果有了B4F3CDB7我是不是可以用conv函数将它转成10进制,再用char函数把它写进去?还是有其它更简单的办法呢?。麻烦版主给个触发器的编写思路吧。。。兄弟我这水平实在是低啊。。。。
missing77 2010-03-16
  • 打赏
  • 举报
回复
当前状态:
+--------------------------+---------------------------+
| Variable_name | Value |
+--------------------------+---------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | C:\mysql5\share\charsets\ |
+--------------------------+---------------------------+
ACMAIN_CHM 2010-03-16
  • 打赏
  • 举报
回复
mysql> select hex('大头');
+-------------+
| hex('大头') |
+-------------+
| B4F3CDB7 |
+-------------+
1 row in set (0.00 sec)

mysql>


B4F3CDB7
‘FFFFFFB4FFFFFFF3FFFFFFCDFFFFFFB7’

看出规律了吗?


“inert into t2 name values (char(-76,-13,-51,-73))” 语句。用触发器的话怎么能正常转换成 ‘大头’呢?
上次的贴子中不是有个算法吗?
missing77 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 acmain_chm 的回复:]
3.2 下你存的应该是 latin1 的字符编码。
现在关键要看你导入后的实际编码是什么,确认后则可以进行转换。
[/Quote]
多谢版主!问号的问题解决了!


另外还是上次提到的关于 char(-76,-13,-51,-73)的问题,还是头晕,麻烦再帮我想想办法
在3.2中 select char(-76,-13,-51,-73) 显示 ‘大头’
select hex(char(-76,-13,-51,-73)) 显示 ‘0’

在5.1中 select char(-76,-13,-51,-73) 显示 ‘? ? ?’
select hex(char(-76,-13,-51,-73)) 显示 ‘FFFFFFB4FFFFFFF3FFFFFFCDFFFFFFB7’

这跟什么有关系呢?如何能在5.1下select char(-76,-13,-51,-73) 显示 ‘大头’?
应用程序是向mysql发送一条 “inert into t2 name values (char(-76,-13,-51,-73))” 语句。用触发器的话怎么能正常转换成 ‘大头’呢?
加载更多回复(2)

56,678

社区成员

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

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