MySQL的中文UTF8乱码问题
发布时间:2024-01-15 01:00:38
从MySQL支持Unicode后,为了与时俱进,我们的web程序也开始考虑用UTF8了。其实UTF8也用了好几年了,程序基本能跑,没什么大问题,但是数据倒换的时候,总是遇到不爽的事情。
【问题现象】
网页xxx.php用EditPlus另存为UTF8格式,MySQL在my.ini里设置default-character-set=utf8,建表时加了CREATE TABLE `xxx ` (myname varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf8,用xxx.php执行insert/update/select出来的都是中文,貌似没问题,但是用phpMyAdmin看select是乱码,用第三方工具软件(如SQLyog)看select也是乱码,mysqldump也是乱码,很不爽。当然,如果你建表的时候,选择了binary/varbinary/blob类型,不会发现乱码,因为指定的是二进制保存,MySQL保存数据时就没有编码的概念了。
【查找问题】
虽然在my.ini里设置default-character-set=utf8,但是执行以下命令时有新发现:
mysql> SHOW VARIABLES LIKE 'character%'; +----------------------------------------+------------------------- | Variable_name | Value +----------------------------------------+------------------------- | character_set_client | latin1 | character_set_connection | latin1 | character_set_database | utf8 | character_set_filesystem | binary | character_set_results | latin1 | character_set_server | utf8 | character_set_system | utf8 | character_sets_dir | D:\mysql\share\charsets\ +----------------------------------------+------------------------- 8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%'; +---------------------------------------+------------------ | Variable_name | Value +---------------------------------------+------------------ | collation_connection | latin1_swedish_ci | collation_database | utf8_general_ci | collation_server | utf8_general_ci +--------------------------------------+------------------ 3 rows in set (0.00 sec) |
发现Value列里面不全是utf8,仍然有部分是latin1,比如其中的client和connection。那网页xxx.php的工作过程就是这样的啦:从xxx.php页面上输入汉字,因为xxx.php是UTF8编码的,所以xxx.php以UTF8格式转换输入的汉字,然后以UTF8提交给mysql,但是mysql的client和connection都是latin1的,而表是UTF8的,所以mysql存储时,先将xxx.php提交的汉字,转成latin1的格式,再转成UTF8字符格式存在表中。如果此时我们用第三方软件或者phpMyAdmin去select查看此表,而表中存储的数据是被latin1过的UTF8字符,出来的时候是以UTF8格式取的,当然看起来时乱码了。解决方法就是让所有过程都是UTF8的就可以了。
【解决问题】
1、从my.ini下手
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] default-character-set=utf8 |
以上3个section都要加default-character-set=utf8,平时我们可能只加了mysqld一项。
然后重启mysql,执行
mysql> SHOW VARIABLES LIKE 'character%';
mysql> SHOW VARIABLES LIKE 'collation_%';
确保所有的Value项都是utf8即可。
2、建表时加utf8,表字段的Collation可加可不加,不加时默认是utf8_general_ci了。
CREATE TABLE `tablename4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `varchar1` varchar(255) DEFAULT NULL, `varbinary1` varbinary(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
3、网页xxx.php保存时选择utf8编码,页头最好加上
header('conten-type:text/html;charset=utf-8');
在执行CRUD操作前先执行一下
mysql_query("set names utf8");
测试代码xxx.php如下:
<?php header('conten-type:text/html;charset=utf-8'); mysql_connect("localhost", "root", "password") or die("Could not connect: " . mysql_error()); mysql_select_db("test"); mysql_query("set names utf8"); $str = "CHN 软件开发有限公司,JPN ソフトウェア開発株式会社,KOR 소프트웨어 개발 유한 공사,RUS Суд программного обеспечения".time(); $sql = "insert into tablename4 (varchar1, varbinary1 ) values ('".$str."','".$str."')"; echo $sql."<hr>"; mysql_query($sql);
$result = mysql_query("SELECT id, varchar1 ,varbinary1 FROM tablename4"); while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { printf ("ID: %s , varchar1: %s, varbinary1: %s<br>", $row[0], $row["varchar1"], $row["varbinary1"]); }
mysql_free_result($result); ?> |
如此设置之后,无论是在php页面插入任何utf8字符,在php页面里取出来的,在phpMyAdmin里取出来的,在mysql的第三方客户端软件里取出来的,都是一样的汉字了,不会再发现乱码,mysqldump出来的也是汉字。OK,问题解决。
【另】在中文windows系统下,在cmd.exe里运行mysql.exe字符终端,不能使用上面的规则,因为默认情况下,中文windows系统cmd.exe里的代码页是cp936即GBK,不能显示全部UTF8字符,所以在字符终端里看到乱码是正常现象,不要奇怪,这个问题在类Unix系统的shell终端里可以解决的。


猜你喜欢
- 在Web开发的时候,经常会遇到的一种情况就是浏览器提示脚本运行时间过长,停止还是继续,无论你选择什么,相信你都会想尽一切办法让这个对话框远离
- 抽象特点Python 一切皆对象,基于此概念,对 类 class 有以下特点:类与实例的属性类对象创建可选择定义类属性,创建实例对象时,实例
- 反射指的是运行时动态的获取变量的相关信息1. reflect 包类型是变量,类别是常量reflect.TypeOf,获取变量的类型,返回re
- 题目内容:对于三角形,三边长分别为a, b, c,给定a和b之间的夹角C,则有:。编写程序,使得输入三角形的边a, b, c,可求得夹角C(
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 在这个自动化时代,我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。 那么在本文中
- 先来看查看效果:在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的
- 什么是字符串格式化,为什么需要这样做?我们有时候刷抖音/B站看到封面很好看,但是进入直播发现,不过如此!想必主播通过某种方式把输出转换为读者
- 一、先进行剪切操作圆形区域占图片可能不多,多余的部分不要。看下图。只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要。先沿着纽扣电池的
- 前言最近开始学习python数据库编程后,在了解了基本概念,打算上手试验一下时,卡在了MYSQLdb包的安装上,折腾了半天才解决。记录一下我
- 记录了mysql 8.0.12 的安装配置方法,分享给大家。一、安装1.从网上下载MySQL8.0.12版本,下载地址2. 下载完成后解压我
- Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统
- 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!!回归正题,我们所要的说的axios的封装和api接口的统一管理,其实主
- 利用zipfile模块和pandas获取数据,代码比较简单,做个记录吧:# -*- coding: utf-8 -*-""
- 如下所示:#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名称:a.py# 作 者
- 公司服务器的mysql和redis连接都需要有跳板机,网上有很多python ssh远程连接mysql的,那天我研究了下,利用sshtunn
- 散点图什么是散点图?散点图是指在数理统计回归分析中,数据点在直角坐标系平面上的分布图, 散点图表示因变量随自变量而变化的大致趋势,
- 前言SQL SERVER 2012中新增了IIF函数,这个函数在VB或是ACCESS中是存在的。感兴趣的朋友们下面来一起学习学习吧。格式如下
- 本文实例讲述了python使用PyGame绘制图像并保存为图片文件的方法。分享给大家供大家参考。具体实现方法如下:''
- 这阵子没有精力完整翻译和发到译言( 现下正渐入状态,预计写博客量会逐步提升回来),简短做一个概要翻译,为近期工作需要做一个参考。