php保存中文sql server 2008里出现乱码

 更新时间:2016年11月25日 16:37  点击:1297
文章收藏了一些常用的解决php保存中文sql server 2008里出现乱码办法,有碰到同类问题的朋友可参考本文章。

今天使用php操作数据库时发现插入SQL Server 2008数据库里的中文字段出现乱码,下面是我一开始时的一些情况:

开发环境是php5.3.3+Apache2.2.17+SQL Server 2008,php脚本文件的编码是utf-8,传给数据库的编码是GB2312(SQL Server的默认字符编码可能是这个,我不肯定),我用的是微软官方提供的SQLSRV库来连接数据库的(PS:SQL Server 2005开始已经不支持用mssql.dll来连接了),故使用sqlsrv_query($conn, "set names GB2312");语句来设置传给数据库的编码格式的,sql语句这样写了:insert into Opinion (content) values ('aaa中文内容');

  运行这条sql语句,发现执行不成功,用sqlsrv_errors()函数来输出错误信息,得到如下结果:

 代码如下 复制代码
Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -46 [code] => -46 [2] => An error occurred translating the query string to UTF-16: �ڶ��ֽڵ�Ŀ�����ҳ�У�û�д� Unicode �ַ����ӳ�䵽���ַ� . [message] => An error occurred translating the query string to UTF-16: �ڶ��ֽڵ�Ŀ�����ҳ�У�û�д� Unicode �ַ����ӳ�䵽���ַ� . ) )

  这是在网页上显示的结果,上面的乱码是原封不动copy下来的。从 “An error occurred translating the query string to UTF-16”可以看出是字符编码转换有问题导致的。于是我使用php的iconv函数来对中文进行强制编码转换,然后执行sql语句,代码如下:

 代码如下 复制代码
$string = iconv('utf-8', 'GB2312//IGNORE', 'aaa中文内容');
$sql    = "insert into Opinion (content) values ( $string)";

  这时候又报错了,错误信息如下:

 代码如下 复制代码
Array ( [0] => Array ( [0] => 42S22 [SQLSTATE] => 42S22 [1] => 207 [code] => 207 [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]���� 'aaa��������' ���� [message] => [Microsoft][SQL Server Native Client 10.0][SQL Server]���� 'aaa��������' ���� ) )

  这个错误信息看不出什么头绪,我又把sql语句输出到网页上看一下是不是sql语句写错了,输出结果如下:

 代码如下 复制代码
insert into Opinion (content) values ( aaa��������)

  咋一看好像没问题,其实是有问题的,注意到后面那个括号里的参数是应该用引号来括起来的(表示它是一个字符串),所以我又修改了sql语句,代码如下:

 代码如下 复制代码
$sql = "insert into Opinion (content) values ( '".$string."')";   为了看清楚我放大点

用单引号把$string括起来,这样之后执行sql语句成功,并且数据库里保存的中文没有乱码。


参考其它的解决办法


若数据库的编码为GB2312,怎样在yii中进行配置才能使得页面的数据显示正常,并且数据库中的数据不能出现乱码:

方法一:

1. yii默认的编码方式是utf-8, 若想改变其编码方式需要在main.php文件中加上'charset'=>'GB2312', 这样才能改变函数的输出的编码方式
2. sql server 2000 的编码方式默认为本地GB2312编码方式, 对数据库进行操作时要注意编码的方式
3. web页面的编码相应的需要变为GB2312
4. 文件保存时需要保存为GB2312编码,这样php文件中的中文字符才能正常解析

方法二:

1. 通过iconv函数对数据进行转码

 代码如下 复制代码
iconv('GB2312','UTF-8',$data)

 

文章介绍了关于windows+php中memcached.exe的安装与配置和liunx中 memcached配置 ,大家可根据自己的系统来方法一或方法二来配置哦。

windows+php中memcached.exe的安装与配置

1.Windows版本的下载地址为: http://code.jellycan.com/memcached/

将压缩文件解压到  c:/memcached/

2. 在CMD下输入 “c:/memcached/memcached.exe -d install” 安装。

3. 再输入:”c:/memcached/memcached.exe -d start” 启动。NOTE:以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

4.若指定了 -m,则表示缓存大小为 -m后的数字,单位是 M,例如:

c:/memcached/memcached.exe –l  127.0.0.1  –m  32   – d start

如下设置memcached使用内存问题帮助:

按照上面的安装步骤安装之后,使用memcached –m 200来调整最大内存占用之后会发现没有起作用,总是默认的64MB的内存,在网上搜了一下,原因是注册表中并没有写入信息,可以这样来修改。

1. memcached –d shutdown 首先关闭memcached服务。

2.进入注册表,找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/memcached Server, 在其中有一个ImagePath项,值为 “c:/memcached/memcached.exe” -d runservice,在后面加上 -l 127.0.0.1 -m 3000 -c 2048。

3.memcached –d start 启动memcached服务,这样就将memcached的最大内存修改为了3000MB。

如果下载的是二进制的版本,直接运行就可以了,可以加上参数来加以设置。

常用设置:

-p <num>          监听的端口
-l <ip_addr>      连接的IP地址, 默认是本机
-d start          启动memcached服务
-d restart        重起memcached服务
-d stop|shutdown      关闭正在运行的memcached服务
-d install        安装memcached服务
-d uninstall      卸载memcached服务
-u <username>     以<username>的身份运行 (仅在以root运行的时候有效)
-m <num>          最大内存使用,单位MB。默认64MB
-M                内存耗尽时返回错误,而不是删除项
-c <num>          最大同时连接数,默认是1024
-f <factor>       块大小增长因子,默认是1.25
-n <bytes>        最小分配空间,key+value+flags默认是48
-h                显示帮助

linux+php中memcached.exe的安装与配置

首页
http://www.danga.com/memcached

下载地址:
http://danga.com/memcached/download.bml

下载文件
memcached-1.2.6.tar.gz
tar zxvf memcached-1.2.6.tar.gz
./configure --prefix=/usr/local/memcached-1.2.6
make
make install

注意:

memcache需要这个包libevent,不然安装时要报错:

checking for libevent directory... configure: error: libevent is required. You can get it from http://www.monkey.org/~provos/libevent/

      If it's already installed, specify its path using --with-libevent=/dir/

下载得到文件libevent-1.4.9-stable.tar.gz

tar zxvf libevent-1.4.9-stable.tar.gz

./configure --prefix=/usr/local/libevent-1.4.9-stable.tar.gz
make
make install

由于我安装没有安装在usr下面,所以最后启动memcache报错:

[root@localhost bin]# ./memcached -d -m 10 -p 11211 -u root -l 0.0.0.0
./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

检查libevent安装情况:

ls -al /usr/lib | grep libevent
把 libevent-1.4.so.2 拷贝/链接到 /usr/lib 中,否则 memcached 无法正常加载。

cp libevent-1.4.so.2 /usr/lib/

文章出处:http://www.diybl.com/course/6_system/linux/linuxjq/20071010/77432.html


安装完之后要启动服务
cd /usr/local/memcached-1.2.6/bin
./memcached -d -m 50 -p 11211 -u root -l 0.0.0.0
参数说明
-m 指定使用多少兆的缓存空间;
-p 指定要监听的端口;
-u 指定以哪个用户来运行

一个不错的简单的数据库连接类程序,有需php mysql数据库连接类的同学可参考本文章。
 代码如下 复制代码


<?PHP
require_once("mssql.class.php");
//1.创建类,并连接数据库
$db = new mssql("dns=aaa;uid=sa;pwd=sa;dbname=test");
//2.连接数据库
$conn = $db->config("dns=aaa;uid=sa;pwd=sa;dbname=test");
//3.选择数据库
$dbname = $db->select_db("test");
//4.设置允许调试
$db->debug = true;
//5.执行一条不返回结果的SQL语句
$db->execute("insert into test01(name) values('这是一个测试!')");
//$db->exec("");
//6.执行一条返回结果的SQL语句
$rs = $db->query("select * from test01");
//7.以row方式显示结果
echo "<br>以row方式显示结果集<br>";
while($r = $db->fetch_row($rs)){
 echo $r[0].":".$r[1]."<br>";
}

//8.以array方式显示结果
$rs2 = $db->query("select * from test01");

echo "<br>以array方式显示结果集<br>";
while($r = $db->fetch_array($rs2)){
 echo $r["id"] . ":" . $r["name"] . "<br>";
}

//X.释放
$db->db_close();

?>


 

出现登陆phpmyadmin出现 #2003 - 服务器没有响应最先想到的是你的mysql服务器是不是停止了检查一下,如果是mysql服务器停止服务了重启就可以解决问题了。

1、在APMServ5.2.6出现问题的最简单的解决办法是

在本地计算机无法启动APMServ-MySQL5.1服务,错误1067,进程意外中止”的方法很简单,只要进入“D:\Program Files\APMServ5.2.6\MySQL5.1\bin”文件夹,找到mysqld-nt.exe文件执行即可。
默认情况下,当启动APMServ的时候,在服务中MySql5.1都是没有启动的,需要执行mysqld-nt.exe文件,开启MySql服务


2.我们还是来检查phpmyadmin配置文件看看

方法一:查找

 代码如下 复制代码
$cfg['Servers'][$i]['auth_type'] = ‘config’;
更改为
$cfg['Servers'][$i]['auth_type'] = ‘http’;

访问的时候需要输入用户名和密码

方法二:”#2003 – 服务器没有响应”PHPMYADMIN登陆问题的解决

问题描述:

登陆PHPMYADMIN的时候提示 #2003 – 服务器没有响应
1 本地其它php+mysql程序运行正常;
2 phpmyadmin 以前运行正常,就最近出错.

解决办法:
找到/libraries/config.default.php文件中以下代码段:
复制内容到剪贴板代码:

 代码如下 复制代码
$cfg['Servers'][$i]['auth_type']     = ‘config’;    // Authentication method (valid choices: config, http, HTTP, signon or cookie) 验证方式一般填写cookie
$cfg['Servers'][$i]['user']          = ‘root’;      // MySQL user
$cfg['Servers'][$i]['password']      = ”;          // MySQL password (only needed with ‘config’ auth_type)
将其中的$cfg['Servers'][$i]['password'] 补上相应的正确密码.
3.连接mysql mysql.exe -u root -p -h 127.0.0.1
然后同步密码guoxue_mmkey_com
mysql> SET PASSWORD FOR -> ‘ some_user ‘@’ some_host ‘ = OLD_PASSWORD(‘ newpwd ‘);
结合我们的实际情况,在 MySQL Command Line Client 下运行:
set password for root@localhost = old_password(’123′);guoxue_mmkey_com
guoxue_mmkey_com

如果以上方法都不能解决,建议重新配置PHP,重新安装一次mysql即可,一般都能解决


注意:
检查防火墙是否关闭了3306端口,或者直接关闭防火墙测试是否可以正常连接到MYSQL,开始-运行,输入IISRESET重新启动IIS,保证mysql比IIS早启动

这是一很基础的东西我们能过构造函数来实现创建类就自动与mysql服务器进行连接,我们只要设置好 $name,$pass,$table三个变量的值就好了。
 代码如下 复制代码

<?php
 class ConnectionMySQL{
     //主机
     private $host="localhost";
     //数据库的username
     private $name="root";
     //数据库的password
     private $pass="";
     //数据库名称
     private $table="phptest";
     //编码形式
     private $ut="utf-8";
 
 
     //构造函数
     function __construct(){
         $this->ut=$ut;
         $this->connect();
 
     }
 
     //数据库的链接
     function connect(){
         $link=mysql_connect($this->host,$this->name,$this->pass) or die ($this->error());
         mysql_select_db($this->table,$link) or die("没该数据库:".$this->table);
         mysql_query("SET NAMES '$this->ut'");
     }
 
     function query($sql, $type = '') {
         if(!($query = mysql_query($sql))) $this->show('Say:', $sql);
         return $query;
     }
 
     function show($message = '', $sql = '') {
         if(!$sql) echo $message;
         else echo $message.'<br>'.$sql;
     }
 
     function affected_rows() {
         return mysql_affected_rows();
     }
 
     function result($query, $row) {
         return mysql_result($query, $row);
     }
 
     function num_rows($query) {
         return @mysql_num_rows($query);
     }
 
     function num_fields($query) {
         return mysql_num_fields($query);
     }
 
     function free_result($query) {
         return mysql_free_result($query);
     }
 
     function insert_id() {
         return mysql_insert_id();
     }
 
     function fetch_row($query) {
         return mysql_fetch_row($query);
     }
 
     function version() {
         return mysql_get_server_info();
     }
 
     function close() {
         return mysql_close();
     }
 
     //向$table表中插入值
     function fn_insert($table,$name,$value){
         $this->query("insert into $table ($name) value ($value)");
     }
     //根据$id值删除表$table中的一条记录
     function fn_delete($table,$id,$value){
         $this->query("delete from $table where $id=$value");
         echo "id为". $id." 的记录被成功删除!";
     }
 }
 
//调用方法

 $db =  new ConnectionMySQL();
 
 $db->fn_insert('test','id,name,sex',"'','hongtenzone','M'");
 $db->fn_delete('test', 'id', 1);
 
 ?>

这里我要讲述一下关于构造函数

 代码如下 复制代码
 //构造函数
     function __construct(){
         $this->ut=$ut;
         $this->connect();
 
     }


这个页面使用了构造函数特别要主要在函数中不要调用数据库连接类了,否则在当前页面会有多连接连接如果访问过大服务器就会出mysql has gone的提法哦。

[!--infotagslink--]

相关文章

  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Mysql在debian系统中不能插入中文的终极解决方案

    在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • python读取和保存mat文件的方法

    本文主要介绍了python读取和保存mat文件的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-25
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • python 实现将Numpy数组保存为图像

    今天小编就为大家分享一篇python 实现将Numpy数组保存为图像,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • 安卓开发之保存ImageView中的图片到本地相册

    下面我们来看一篇关于安卓开发之保存ImageView中的图片到本地相册教程吧,希望这篇教程能够给大家带来帮助. 代码如下. private void saveImage(ImageView imageVi...2016-11-01
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • php 判断是否是中文/英文/数字示例代码

    复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04
  • C#抓取网络图片保存到本地的实现方法

    下面小编就为大家分享一篇C#抓取网络图片保存到本地的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • php中文转换成拼音代码

    <?php教程 function cn2pinyin($_string, $_code='gb2312') { $_datakey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|b...2016-11-25
  • JavaScript过滤字符串中的中文与空格方法汇总

    这篇文章主要介绍了JavaScript过滤字符串中的中文与空格方法汇总 的相关资料,需要的朋友可以参考下...2016-03-09
  • three.js显示中文字体与tween应用详析

    这篇文章主要给大家介绍了关于three.js显示中文字体与tween应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-04
  • php 根据啊拉伯数字转变成大写中文数字

    // 原是是根据用户输入的数字判断再转换成想要的大写数字,如果我们先把大小写存在一个数组,再判断进行转换就OK了。 $data = $_POST['rmb']; if (!ereg("^[0-9.]",$dat...2016-11-25