WenRou's Blog

新浪微薄腾讯微薄

最新碎语:测试图片碎语哦

您的位置:WenRou's Blog >lnamp> mysql 数据库 latin1 导致的乱码

mysql 数据库 latin1 导致的乱码

mysql 数据库 latin1 导致的乱码

很多年以前遇到 mysql 的乱码问题。最近又遇到了。

mysql 这货,默认的编码是 latin1 (例如 latin1_swedish_ci)。——实在不明白为什么是这样。

而最近10年,主流的编码方式已经是 utf8 。mysql 中,最初采用 utf8_generalci 与其匹配,后来逐渐地使用 utf8unicode_ci 与其匹配。

比较神奇的是,有时候,mysql 数据库已经从 latin1 转成了 utf8 ,但是,phpmyadmin 中,显示出来的是乱码,而程序中现出来的却是正常的。——因此,如果不看数据库,也许不知道 mysql 层面保存的数据已经乱成一团。

但是,如果后期需要转移数据、或者恢复数据,就很可能发现了这些乱码,并且发现程序读取之后的字符也是乱码了。

今晚找到半天,终于在 煩人的latin1轉utf-8問題 找到了解决办法。

这个解决办法的主要思路就是:既然原来的数据是 latin1 格式的,那么,备份时就先按照 latin1 格式去把数据弄出来:

mysqldump -c -h localhost --user 用户名--password=用户密码 --default-character-set=latin1  --skip-set-charset  数据库名|bzip2 > mysql-backup-`date +%Y%m%d`.bz2 

将这个压缩包里面的文件另存为 utf8 格式的 sql 文件之后,在顶部增加这一行:

SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary; 

然后,重新导入即可。


ghost中文网在 在阿里云服务器上安装 Ghost (3)-- 安装 MySQL 提到如何设置 mysql 的默认字符集,如下:

1、编辑 /etc/mysql/my.cnf

nano -w /etc/mysql/my.cnf 

2、找到 [mysqld] 这一段,增加以下 3 行; ——如果没有 [mysqld] 这一行,就先新增这行

collation-server = utf8_unicode_ci  init-connect='SET NAMES utf8'  character-set-server = utf8  

重新启动 mysql 之后,就能避免 mysql 采用奇葩的 latin1 字符集了。

---

转载请注明本文标题和链接:《mysql 数据库 latin1 导致的乱码

发表评论

53 + 2 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交