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倒能显示。。为什么
>.<     

解决方案 »

  1.   

    原来的mysql3.2环境如下:
    mysql>show variables like '%char%';
    ---------------------------------------------------------------------------+
    | character_set  | latin1                                                                                                                                                                                                  |
    | character_sets | latin1 big5 czech euc_kr gb2312 gbk sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5 |
    +----------------+---------------------------------------------------
      

  2.   

    什么都不改,select Name from t1 是正常的中文
    此时的 show variables like '%char%'; 结果是什么?
      

  3.   

    此时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
      

  4.   

    字符集没有统一,
    SET NAMES UTF8,在新字符集下重新插入记录
      

  5.   

    我是先把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里运行。
      

  6.   

    你应该用MYSQL自己的MYSQLDUMP来导入、导出,估计在导入5。X版本时出问题了
      

  7.   

    两种情况下提供一下你的select hex(name),name from T1 where ....应该是你的name 字段中存储的字符并不是GB2312 , 贴出结果具体分析后再找出如何处理。
      

  8.   

    在5.1中结果如下:
    CDF5C0DA 王磊
    C0EED0C2 李欣在3.2中结果如下:
    0 王磊
    0 李欣3.2的正常显示,5.1的是问号。
      

  9.   

    3.2中name字段是 varchar 二进位 导入5.1中二进位就没有了。是不是跟这个有关系?在5.1中我试着建了一个字段,选 择二进位,但建完后“二进位”的勾还是没有。怎么才能在5.1下建二进位的字段。。
      

  10.   

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

  11.   

    3.2 下你存的应该是 latin1 的字符编码。
    现在关键要看你导入后的实际编码是什么,确认后则可以进行转换。
      

  12.   

    多谢版主!问号的问题解决了!
    另外还是上次提到的关于 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))” 语句。用触发器的话怎么能正常转换成 ‘大头’呢?
      

  13.   

    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))” 语句。用触发器的话怎么能正常转换成 ‘大头’呢?
    上次的贴子中不是有个算法吗?
      

  14.   

    当前状态:
    +--------------------------+---------------------------+
    | 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\ |
    +--------------------------+---------------------------+
      

  15.   

    多谢版主提示,。。可是如何能把‘FFFFFFB4FFFFFFF3FFFFFFCDFFFFFFB7’变成 B4F3CDB7?
    如果有了B4F3CDB7我是不是可以用conv函数将它转成10进制,再用char函数把它写进去?还是有其它更简单的办法呢?。麻烦版主给个触发器的编写思路吧兄弟我这水平实在是低啊。
      

  16.   

    FFFFFFB4FFFFFFF3 得到 B4F3 然后可以直接 char(0xB4F3) 得到 依次取出所有的汉字,生成新的字符串,在触发器中 set new.name = char(0xB4F3CDB7) ,不过要注意对非汉字字符的处理,比较英文和数字,需要判断一下。
      

  17.   


    感谢版主,其本差不多了。但又有个小问题请教一下:
    比如我的数据是 “大头人”
    用:select char(0xB4F3CDB7C8CB) 显示 "头人" 最前面的“大”字不显示。
    我转换成10进制也是一样的。这是什么原因?要如何解决?
      

  18.   

    问题全部解决,非常感谢ACMAIN_CHM版主的无私帮助!