MySQL字符编码问题 缘由 本地开发环境下数据库MySQL中插入中英文插入、读取都ok,无论是MySQL控制台下插入、读取还是借助第三方GUI
工具都是ok的,但是部署到线上Linux机器后插入MySQL后,查看中文部分是乱码。
1 2 3 4 PHP Version 7.0.15 MySQL 5.7.16 Apache 2.0 Handler
1 2 3 4 PHP Version 7.0.19 Apache 2.0 + Nginx 1.10 MySQL 5.7.16
问题分析 MySQL相关封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 <?php include_once 'sql.interface.php' ; class mysqlHelper implements ISQLHelper { private $host ; private $userName ; private $passWord ; private $conn ; public function __construct ($host , $userName , $passWord ) { $this ->host = $host ; $this ->userName = $userName ; $this ->passWord = $passWord ; $this ->conn = new mysqli ($this ->host, $this ->userName, $this ->passWord) or die ("Fail to Connect MySQL Server" .mysqli_error ()); } public function _selectDB ($db ) { mysqli_select_db ($this ->conn, $db ); } public function _query ($sql ) { return mysqli_query ($this ->conn, $sql ); } public function isExistData ($sql ) { $result = $this ->_query ($sql ); if ($result ->num_rows >= 1 ) { return true ; }else { return false ; } } public function execute_dql2 ($sql ) { $arr = array (); $i = 0 ; $res = mysqli_query ($this ->conn, $sql ) or die (mysqli_error ($this ->conn)); while ($row = mysqli_fetch_assoc ($res )) { $arr [$i ++]=$row ; } mysqli_free_result ($res ); return $arr ; } public function execute_dml ($sql ) { $r = mysqli_query ($this ->conn, $sql ); if (!$r ){ return 0 ; }else { if (mysqli_affected_rows ($this ->conn) > 0 ){ return 1 ; }else { return 2 ; } } } public function close_connect ( ) { if (!empty ($this ->conn)){ mysqli_close ($this ->conn); } } }
本地run脚本插入读取带有中文的数据一切OK,本地run 链接远程数据库时,插入读取中文相关也ok。当把脚本放在online机器时就产生了乱码问题。
检查MySQL配置文件my.cnf
1 2 3 4 5 6 7 8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server=utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server=utf8
配置文件ok。
修改链接层字符 mysqli_query("set names utf8");
尝试无果。
Bing搜索🔍查询,有一个PHP针对MySQL连接层字符编码设置 mysqli_set_charset($link, );
[PHP官方推荐使用!]
源码定义:
1 2 3 4 5 6 7 8 9 10 function mysqli_set_charset ($link , $charset ) {}
通过在连接层设置字符编码为utf8
即可解决。
mysqli_set_charset($this->conn, "utf8");
。
参考:https://stackoverflow.com/questions/26596294/set-names-vs-mysqli-set-charset-besides-affecting-mysqli-escape-string-are