被 mysql 4.1.x 的字符集问题搞的快疯了,请求帮助!

cosin0001 2004-11-21 04:12:44
装了 MySQL 4.1.7 ,看到有选择字符集的,就选了 gbk,然后用 phpmyadmin 建了几个表,都使用 gbk的字符集,使用 gbk_bin 的 collation(phpmyadmin里这个翻译为 整理)。

在 MySQL 命令行里执行 select * from user_acc where name='aa',出现如下错误

ERROR 1267 (HY000): Illegal mix of collations (gbk_bin,IMPLICIT) and (latin1_swe
dish_ci,COERCIBLE) for operation '='

去查了资料,发现是字符集的问题。按照找到的资料,将 my.ini 里的参数做如下变动
[client]
default-character-set=gbk
default-collation=gbk_bin
[mysqld]
default-character-set=gbk
default-collation=gbk_bin

重启 MySQL 服务,再进入 MySQL 命令行,还是同样的错误
查看 当前环境变量,发现 关键的 还是没变
mysql> show variables like "%char%";
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | D:\WWW\MySQL\MySQL Server 4.1\share\charsets/ |
+--------------------------+-----------------------------------------------+
7 rows in set (0.00 sec)

mysql> show variables like "%colla%";
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci | <= 这个关键
| collation_database | gbk_bin |
| collation_server | gbk_bin |
+----------------------+-------------------+
3 rows in set (0.00 sec)

在命令行中执行 set collation_connection=gbk_bin;

+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| collation_connection | gbk_bin |
| collation_database | gbk_bin |
| collation_server | gbk_bin |
+----------------------+---------+
3 rows in set (0.00 sec)

然后执行 select * from user_acc where name='aa',没有错误

在 php 的连接数据库的 conn.php 做如下改动
/********************************************************/
<?
$conn = new mysqli("localhost", "dbAcc", "dbPass", "dbName");
if(mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// 添加以防止字符集问题
$conn->query("SET character_set_client = gbk");
$conn->query("SET character_set_connection = gbk");
$conn->query("SET character_set_database = gbk");
$conn->query("SET character_set_results = gbk");
$conn->query("SET character_set_server = gbk");

$conn->query("SET collation_connection = gbk_bin");
$conn->query("SET collation_database = gbk_bin");
$conn->query("SET collation_server = gbk_bin");
?>
/********************************************************/
使用另一个 test.php
/********************************************************/
<?php include_once('conn.php')?>
<?
$sSQL = "show variables like '%char%'";
if($rs = $conn->query($sSQL))
{
while($row = $rs->fetch_row())
{
printf ("%s = %s<br>", $row[0], $row[1]);
}
$rs->close();
}
$sSQL = "show variables like '%coll%'";
if($rs = $conn->query($sSQL))
{
while($row = $rs->fetch_row())
{
printf ("%s = %s<br>", $row[0], $row[1]);
}
$rs->close();
}
$sSQL = "select * from user_acc where name='aa'";
if($rs = $conn->query($sSQL))
{
printf("Query OK!");
$rs->close();
}
?>
<?php include_once('close.php')?>
/********************************************************/
页面显示
character_set_client = gbk
character_set_connection = gbk
character_set_database = gbk
character_set_results = gbk
character_set_server = gbk
character_set_system = utf8
character_sets_dir = D:\WWW\MySQL\MySQL Server 4.1\share\charsets/
collation_connection = gbk_bin
collation_database = gbk_bin
collation_server = gbk_bin
Query OK!

本来以为这样就搞定了,接下来的事把我搞疯了

在 MySQL 的命令行里 执行
mysql>insert user_acc (name,password) values('中文','test');
mysql>select * from user_acc;
+----+------+----------+---------------------+---------+-------+--------+
| id | name | password | lastlogin | lastip | level | enable |
+----+------+----------+---------------------+---------+-------+--------+
| 1 | ???? | test | 2004-11-21 15:28:36 | 0.0.0.0 | 0 | 1 |
+----+------+----------+---------------------+---------+-------+--------+
在页面 test.php 中 select user_acc 显示出来也是 ???

然后在 test.php 中 update user_acc set name='中文' where id=1
重新 在页面 select user_acc
页面显示正确。

难道 MySQL 命令行不可以直接使用中文么?如果是这样的话,那以后需要导出导入大量数据时,怎么做?
我原来都是先导出到文件,然后命令行里执行 source xxx.sql 的。

顺便说下系统配置:
Windows 2000 Server
Apache 2.x PHP 5.0.2 MySQL 4.1.7
...全文
1408 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
hy2003fly 2005-08-11
  • 打赏
  • 举报
回复
照我上面讲的方法重新进行一次:MySQL Sever Instance Config wizard!不过密码一定要不同于现在正在用的密码,否则会说安全应用不成功的哦。
hy2003fly 2005-08-09
  • 打赏
  • 举报
回复
在安装mysql的时候,不要选默认的Standard Character Set,选Best Support For Multilingualism默认的字符集为utf8,要是选了这个的话就会有:
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 4.1\share\charsets/ |
+--------------------------+-----------------------------------------------+
可见仍有几个变量没有统一!
选Manual Selected Default Character Set/Collation 再在下拉框中选GB2312或GBK就可以解决中文问题了。
conquerHUST 2005-06-29
  • 打赏
  • 举报
回复
我以前也遇到过这样的问题,解决的办法是在每次查询之前都进行一次设置set NAMES = 'gbk';记住是每次运行查询前都要这样,你可以把操作写进存储过程,第一句就是set NAMES = 'gbk';
tmdbcd0630 2005-06-28
  • 打赏
  • 举报
回复
完全看下来,学习了不少.回复楼上的朋友.我的4.0.17 for winnt 改过MY.INI存储后,再进就没有发现恢复默认值.
fzq97 2005-06-28
  • 打赏
  • 举报
回复
求教mysql数据库字符集乱码问题:
windows环境安装mysql-4.1版本,安装的时候选择数据库字符集为:gbk
安装后执行mysql进入数据库

mysql> show variables like "%char%";
+--------------------------+--------------------------+
| Variable_name | Value |
+--------------------------+--------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | G:\mysql\share\charsets/ |
+--------------------------+--------------------------+
7 rows in set (0.28 sec)

mysql> show variables like "%colla%";
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | gbk_chinese_ci |
| collation_server | gbk_chinese_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

然后执行
mysql> ET character_set_client = gbk;
SET character_set_connection = gbk;
SET character_set_database = gbk;
SET character_set_results = gbk;
SET character_set_server = gbk;


SET collation_connection = gbk_bin;
SET collation_database = gbk_bin;
SET collation_server = gbk_bin;

设置以后再执行命令看字符集
mysql>mysql> show variables like "%char%";
+--------------------------+--------------------------+
| Variable_name | Value |
+--------------------------+--------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | G:\mysql\share\charsets/ |
+--------------------------+--------------------------+
7 rows in set (0.00 sec)

mysql>
mysql> show variables like "%colla%";
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| collation_connection | gbk_bin |
| collation_database | gbk_bin |
| collation_server | gbk_bin |
+----------------------+---------+
3 rows in set (0.00 sec)

字符集已经改变,但问题是我
mysql> exit;
退出以后再从新mysql进入
mysql> mysql> show variables like "%char%";
+--------------------------+--------------------------+
| Variable_name | Value |
+--------------------------+--------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | G:\mysql\share\charsets/ |
+--------------------------+--------------------------+
7 rows in set (0.00 sec)

mysql> show variables like "%colla%";
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | gbk_chinese_ci |
| collation_server | gbk_chinese_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

发现上次set设置的字符集又变成系统默认的了,我想请教一下怎么设置字符集才

能让他永久生效,不用每次进入都设置字符集,而且java程序链接也不会出现乱

码问题?
大家有好的方法告诉我: E_mail:fzq97@sohu.com ; QQ:274350525


(注:1、更改字符集也可知执行 mysql> SET NAMES 'gbk'; 也可以设置字符集

但退出mysql状态重新进入上次的设置还是不生效;
2、进入mysql数据库时设置变量也可以生效,但每次敲比较麻烦;
mysql -uroot -proot --default-character-set=gbk test )

thinhunan 2005-06-28
  • 打赏
  • 举报
回复
果然豫闷。
fzq97 2005-06-23
  • 打赏
  • 举报
回复
大虾们求救:知道怎么保存设置么?commit 之类的好像不起作用?set 以后重新进入mysql怎么才能生效呢?
lee3f 2005-06-23
  • 打赏
  • 举报
回复
是否是要保存设置,晕?不懂
fzq97 2005-06-23
  • 打赏
  • 举报
回复
请问楼主:我在mysql状态set设置以后,为什么到下次mysql进来后,又变成了原来默认的啦,我怎么才可以让改变以后的环境变量生效!
SET character_set_client = gbk
SET character_set_connection = gbk
SET character_set_database = gbk
SET character_set_results = gbk
SET character_set_server = gbk

SET collation_connection = gbk_bin
SET collation_database = gbk_bin
SET collation_server = gbk_bin

以后,然后退出mysql状态重新登陆后

mysql> show variables like "%char%";
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | D:\WWW\MySQL\MySQL Server 4.1\share\charsets/ |
+--------------------------+-----------------------------------------------+
不知道为什么,请指教?
pwtitle 2005-01-09
  • 打赏
  • 举报
回复
呵呵,楼主你的设置就没有错误的,关键在你以前的数据库的字符集,你把数据表结构导出看看就明白了。
我以前也遇到过这问题的。
dcomman 2005-01-08
  • 打赏
  • 举报
回复
在 my.ini 里

SET character_set_client = gbk
SET character_set_connection = gbk
SET character_set_database = gbk
SET character_set_results = gbk
SET character_set_server = gbk

SET collation_connection = gbk_bin
SET collation_database = gbk_bin
SET collation_server = gbk_bin
Xiaobaisha2001 2005-01-07
  • 打赏
  • 举报
回复
学习
jett_xu 2004-12-08
  • 打赏
  • 举报
回复
这样是可以了,但是如何在my.ini中定义
让它支持中文呢?
我有原来版本导出的数据
解决办法在SQL文件的头部放了上面设置的语句
在产生连接池的时候上也应该添加相应的设置语句
就是麻烦了一点,是否有办法直接在.INI文件中进行配置?谢谢
showstv 2004-12-03
  • 打赏
  • 举报
回复
william_kai(凯) :

你是不是要在java中用mysql??
william_kai 2004-12-02
  • 打赏
  • 举报
回复
[showstv(0!0)]兄弟,怎么联系你?我的QQ:4080786
william_kai 2004-12-02
  • 打赏
  • 举报
回复
楼主,怎么联系你?我的QQ是4080786,我遇见的问题和你描述的一模一样,设置好变量,还是出错,并且默认值不能改变。我们好好讨论一下!
cosin0001 2004-12-02
  • 打赏
  • 举报
回复
回复人: showstv(0!0) ( ) 信誉:100

你的表用的是 latin1_swedish_ci 字符集
要修改表的字符集设置
showstv 2004-12-01
  • 打赏
  • 举报
回复
楼主啊! 我按照你说的,设置了一下, 不行啊!
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | D:\MySQL\MySQL Server 4.1\share\charsets/ |
+--------------------------+-------------------------------------------+

mysql> show variables like "%colla%";
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| collation_connection | gbk_bin |
| collation_database | gbk_bin |
| collation_server | gbk_bin |
+----------------------+---------+
3 rows in set (0.00 sec)

然后执行 查询语句
mysql> select * from bordinfo where bordname='s';
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (
gbk_bin,COERCIBLE) for operation '='

还是出错阿!!!
怎么办??

另外,我发现,当前设置好的参数,到下次进来后,又变成了原来默认的拉! 真是郁闷,为什么这样啊??
mysql>
pwtitle 2004-11-24
  • 打赏
  • 举报
回复
因为系统已经给你设好默认字符级
ncowboy 2004-11-23
  • 打赏
  • 举报
回复
每次查询之前,发送一个查询set来设置字符集,这样安全而且程序的移植性也高啊
加载更多回复(5)

56,687

社区成员

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

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