[MySQL]处理字符编码的一些心得
因为我在写程式所用的到的 MySQL,同时有 3.x 版及 5.x 版要处理,所以对 MySQL 的字符编码问题需要特别做研究,研究了一阵子之后,终于有了一些初步的心得,列出旧版及新版的 MySQL 做为比较:
MySQL 4.1 以后的版本
- 程式要指定与 MySQL 传输时的编码,ex:
use NAMES 'utf8'
(不指定时为“latin1”)
- 定义字串字段时,也需指定字符集,ex:
Title varchar(5) character set utf8 default NULL
(不指定时为“latin1”)
- char(n), varchar(n), tinytext()… 等字串型态的字段,其容量的计算单位改为“字数”。
- MySQL 相关的字串函数也是以“字数”做处理。
- 建议使用 phpMyAdmin 2.9.2 以后的版本维护数据库。
MySQL 4.0 以前的版本
- 程式不需特别指定与 MySQL 传输时的编码,写入数据库是什么就是什么 (默认为“latin1”),例如,你写入了 utf8 的字符,其结果就是“用 latin1 的格式储存 utf8 的资料”。
- 定义的字串字段也不需指定字符集 (默认为“latin1”)
- char(n), varchar(n), tinytext()… 等字串型态的字段,其容量的计算单位一律为“字节”。
- MySQL 相关的字串函数一样是以“字节”做处理。
- 建议使用 phpMyAdmin 2.5.7 以前的版本维护数据库。
使用 MySQL 4.1 以后的数据库,但沿用 MySQL 4.0 以前的处理模式
既然 MySQL 4.1 以后的版本,在不指定编码格式的情况下,其默认的也是“latin1”,那我全部都不要指定,不就可以与 MySQL 4.0 以前的版本相容了吗?!
其实这样说也没错,只是你在字串的字段及相关字串函数的处理上会比较不那么“聪明”,例如: unicode 的字符都被以“字节”的方式来处理 (毕竟原本 Unicode 的中文字至少从 3 个字节起跳),并且新版的 phpMyAdmin 无法正确显示你的数据库内容。
不过,假如你的数据库是 MySQL 4.1 以后的版本,但基于
- 我不用 Unicode 储存资料。
- 我用 Unicode 储存资料,但不在乎 MySQL 在字符的处理上,是被当成了字节。
在不更动 server 的设定下,可以使用以下的做法让新版的 phpMyAdmin 可以来管理 MySQL 数据库:
编辑 phpMyAdmin 在 libraries 目录下的 select_lang.lib.php,
- 搜寻:
'utf-8' => 'utf8',
改成:
'utf-8' => 'latin1',
(搜寻的字串应该位于 $GLOBALS['mysql_charset_map'] 或 $mysql_charset_map 阵列之中)
- 储存即可。
参考网页
- 网站制作学习志: MySQL 中文编码彻底研究
- 酷学园: MySQL超出字段长度后仍能储存
- MySQL 的“SET NAMES xxx”字符编码问题分析
No comments yet.