php读取.sql文件,写入mysql,navicat显示乱码,编码设置

案例:
php文件:install.php
--------编码:php保存文件的编码、php header编码、php程序的默认编码、php写入数据库的编码
php读取的sql代码文件:php.sql
--------编码:sql保存文件的编码
mysql数据库:test1
--------编码:mysql数据库程序的默认编码、test1的字符集编码、排序规则,表里边每个字段的字符集编码和排序规则
navicat软件
--------编码:建立连接时的编码

install.php文件的源代码:

<?php
header("Content-type: text/html; charset=gb2312");
//读取文件内容
$_sql = file_get_contents('phplyb.sql');

$_arr = explode(';', $_sql);
$_mysqli = new mysqli('localhost','root','11111111');
if (mysqli_connect_errno()) {
exit('连接数据库出错');
}
//执行sql语句
foreach ($_arr as $_value) {
$_mysqli->query("SET NAMES 'gb2312'");
$_mysqli->query("CREATE DATABASE IF NOT EXISTS test1 DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;");
$_mysqli->query("USE test1");
$_mysqli->query($_value.';');
}
$_mysqli->close();
$_mysqli = null;

 

?>

问题:案例中那么多的编码,一不注意就碰到乱码问题,到底该怎么设置?

分析:
亲测。实际上,其他的编码都不重要,mysql、php、navicat以及php header的语言编码都可以默认。主要是保持这几个编码一致:sql保存文件的编码、php文件中两个mysqli->query语句中的编码和排序规则、数据库表里边每个字段的字符集编码和排序规则,都是utf8或者都是gb2312。

另外,如果需要指定mysql数据库程序的默认编码,可以在my.ini里添加如下参数:

[mysql]
default-character-set=utf8 <------
==========================================
[mysqld]
default-character-set=utf8 <------

箭头所指的地方确保为utf8(注意不是utf-8),navicat 里的使用的是mysql字符集(此时不用再选择utf-8编码), 问题才得以解决!