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 导致的乱码》
发表评论