这几天被MySQL的“許功蓋”问题整惨了,终于搞定

“許功蓋”问题解决方案

1修改my.ini(Windows)/my.cnf(Linux)
my.ini路径 %SYSTEMROOT%/my.ini
my.cnf路径 /etc/my.cnf
修改配置文件如下
--------------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#下面一行为加入部分
default-character-set = big5
set-variable=max_connections = 1000

[mysql.server]
user=mysql
basedir=/var/lib

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#下面两行为加入部分
[client]
default-character-set = big5
--------------

2修改SQL语句,在SQL语句后面插入一个空格

3修改php.ini文件
如下
-----------------
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = on
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off
-----------------
但是这样处理后,SQL语句就会变成如下
INSERT INTO test (id ,name ) VALUES('' ,'許\功\蓋');
不怎么美观,不过也没什么不过就是取出的时候使用stripslashes

4程序里处理
在程序里把用"許功蓋"addslashes( $str)处理一下
使用SQL语句
INSERT INTO test (id ,name ) VALUES('' ,'".addslashes('許功蓋')."');
取出的时候使用stripslashes一下

5使用UTF-8

完毕

由于我目前这个项目是PHP+MySQL的后台管理,Delphi+MySQL为前台

所以我选择方案一,问题到此结束

以上是参考了一下资料写出来的,全部通过测试

PHP测试程序如下,提交的字符一定要是繁体的"許功蓋"

1<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
1<form action="  &lt;?= $_SERVER  [  'PHP_SELF'  ]  ?&gt; " method="post" target="_self">
2<input id="username" name="username" type="text"/>
3<input id="submit" name="submit" type="submit" value="submit"/>
4<input id="reset" name="reset" type="reset" value="reset"/>
5</form>
Create (); foreach( $HTTP_POST_VARS as $k => $v ) { $ $k = $v ; } echo $QueryStr = "INSERT INTO test (id ,name ) VALUES('' ,'" . $username . "');" ; $sql -> Insert ( $QueryStr ); echo "\n " . $sql -> a_id ; ?> 哦,顺便介绍一下“許功蓋”问题 “許功蓋”问题是在BIG5编码下,如果字符串的最后一个字符是“許功蓋”中的三个字 当然不止这3个字,这三个字只是常见的三个字, 如果在SQL语句存在这样的情况的话 INSERT INTO test (id ,name ) VALUES('' ,'許功蓋'); 是根本无法插入的 我在备份和恢复数据库的时候经常碰见这种情况,苦笑不得,郁闷之极 只有采用如上几种方法才能搞定 上面说的“許功蓋”问题只是在繁体中文里的问题 理论上我们简体中文也是有这个问题的,只是目前没有一个确切的名称
Published At
Categories with Web编程
Tagged with
comments powered by Disqus