Rumah  >  Artikel  >  pembangunan bahagian belakang  >  mysql插入中文乱码

mysql插入中文乱码

WBOY
WBOYasal
2016-06-23 14:20:35896semak imbas

php文件里设置了网页编码为utf-8
header("Content-type:text/html; charset=utf-8"); 

插入数据库前设置了传递给数据库的编码为utf-8
$this->mysqli->query("set names utf8");

数据库中,设置了一些字符集有关的变量
查询show variables like 'char%';后结果为


查询show variables like 'collation_%';后结果为


我用的WampServer,修改mysql配置文件my.ini,在[client]节点下添加default-character-set=utf8 ,在[mysqld]节点下添加character_set_server=utf8,然后重启musql服务


但是传到数据库里,中文字符都变成了问号。。请问应该如何设置才能解决乱码?


回复讨论(解决方案)

把你做的所有修改都还原的初始状态!

需要注意的是:
1、所有与字符集相关的设置,都不会影响到数据库中的已有数据
2、字符集相关的设置,只对设置后插入的数据生效
3、数据库是共有资源,不要轻易修改设置。以免引发其他应用的问题

只要做到以下两点,就不会出现乱码问题
1、所有可能会有中文内容的字段,都需要有中文字符集的连接校对。至于是哪个字符集都无所谓(gbk、utf8、ucs2都可以)也不需要每个字段都相同
2、每次在连接数据库之后,执行一次 set name 页面字符集

我就是设置完数据库字符集后删除数据表中原有乱码数据,再执行程序,插入的中文还是乱码。

因为自己练习用的是测试数据库,所以就修改了字符集设置。我自己也记不清默认配置是什么了,怎么恢复啊。。。

每次连接数据库后,我都执行$this->mysqli->query("set names utf8"); 应该没有问题吧?
所有可能会有中文内容的字段,都需要有中文字符集的连接校对,这个每太明白,是指show variables like 'collation_%';语句执行后显示的结果吗?

新手刚入门,请大神不吝赐教,感谢不尽。

连接数据库的工具类

<?php  class MysqliHelper{    private $mysqli;	private static $host = "localhost";    private static $user = "root";	private static $pwd = "";	private static $db = "test";		public function __construct(){	  $this->mysqli = new Mysqli(self::$host,self::$user,self::$pwd,self::$db);	  if($this->mysqli->connect_error){	     die("连接数据库失败".$this->mysqli->connect_error);	  }	   $this->mysqli->query("set names utf8");	}		public function execute_dql($sql){	    $res = $this->mysqli->query($sql) or die($this->mysqli->error);	    return $res;	}		public function execute_dml($sql){	     $res = $this->mysqli->query($sql) or die($this->mysqli->error);		 		 if(!$res){		    return 0;		 }else{		    if($this->mysqli->affected_rows>0){			  return 1;			}else{			  return 2;			}		 }	}  }?>


表的字符集是什么?应该不影响你的保存结果~

表的字符集是什么?应该不影响你的保存结果~

怎么查看表的字符集?我用的都是默认的字符集,修改过的配置请看一楼截图。

shou create table 表名; 或者用phpmyadmin图形化工具也可以查看。

打错,是 show create table 表名; 

CREATE TABLE `tb_userinfo` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=latin1



是latin1啊,怎么改成utf8?

CREATE TABLE `tb_userinfo` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=latin1



是latin1啊,怎么改成utf8?

进入phpmyadmin修改

删去原表
drop table tb_userinfo

重新创建
CREATE TABLE `tb_userinfo` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8

其实可以不用这么做
只需修改连接校对就可以了
ALTER TABLE `tb_userinfo` CHANGE `username` `username` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 

改了表字符集,字段也是要改的,你就drop table; 后再重新建表。

CREATE TABLE `tb_userinfo` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `email` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8;

注意备份数据就好了。其实如果你不担心用phpmyadmin查看乱码的话,只要在php链接数据库的时候设置好字符集,不影响数据的存取。。。正常的话,网站下尽量不挂phpmyadmin,随用随传,免得出问题~~

drop后重新建表,现在表的字符集是utf8了
但是使用

$sql = "insert into tb_userinfo (username,password,email) values('sss李四','123456','lis@sina.com')";

后,插入后只显示sss,如果是纯汉字的话,什么也插不进去。

php文件另存为utf-8 无bom 格式

终于成功了,太感谢大家了。我现在练习,用的记事本创建的php文档,默认编码是ANSI。

但是每次都要这么麻烦的设置吗?
感觉mysql支持中文好麻烦。可能有的地方不需要修改我也改了,不知道哪些配置是必须修改的呢?

参考#1 版主的回复,my.ini 里面的参数都不用改,只需设置好set names utf8; 即可(当然,如果你的表是gbk,这里就为 gbk), 还有你要保证插入的数据的编码要与数据库中的编码一致才行。

人家用 utf-8 是因为他在 linux 下只能用 utf-8
你在 window 下,默认就是 gbk,搞成 utf-8 不是自找麻烦吗?

有人说用 utf-8 是为了国际化,其实有几个洋人能看懂方块字呢?

再次感谢大家,结贴散分。

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn