MySQL 处理字符编码的一些心得

因为我在写程式所用的到的 MySQL,同时有 3.x 版及 5.x 版要处理,所以对 MySQL 的字符编码问题需要特别做研究,研究了一阵子之后,终于有了一些初步的心得,列出旧版及新版的 MySQL 做为比较:

MySQL 4.1 以后的版本

  1. 程式要指定与 MySQL 传输时的编码,ex:
    use NAMES 'utf8'

    (不指定时为“latin1”)

  2. 定义字串字段时,也需指定字符集,ex:
    Title varchar(5) character set utf8 default NULL

    (不指定时为“latin1”)

  3. char(n), varchar(n), tinytext()… 等字串型态的字段,其容量的计算单位改为“字数”。
  4. MySQL 相关的字串函数也是以“字数”做处理。
  5. 建议使用 phpMyAdmin 2.9.2 以后的版本维护数据库。

MySQL 4.0 以前的版本

  1. 程式不需特别指定与 MySQL 传输时的编码,写入数据库是什么就是什么 (默认为“latin1”),例如,你写入了 utf8 的字符,其结果就是“用 latin1 的格式储存 utf8 的资料”
  2. 定义的字串字段也不需指定字符集 (默认为“latin1”)
  3. char(n), varchar(n), tinytext()… 等字串型态的字段,其容量的计算单位一律为“字节”。
  4. MySQL 相关的字串函数一样是以“字节”做处理。
  5. 建议使用 phpMyAdmin 2.5.7 以前的版本维护数据库。

使用 MySQL 4.1 以后的数据库,但沿用 MySQL 4.0 以前的处理模式

既然 MySQL 4.1 以后的版本,在不指定编码格式的情况下,其默认的也是“latin1”,那我全部都不要指定,不就可以与 MySQL 4.0 以前的版本相容了吗?!

其实这样说也没错,只是你在字串的字段及相关字串函数的处理上会比较不那么“聪明”,例如: unicode 的字符都被以“字节”的方式来处理 (毕竟原本 Unicode 的中文字至少从 3 个字节起跳),并且新版的 phpMyAdmin 无法正确显示你的数据库内容。

不过,假如你的数据库是 MySQL 4.1 以后的版本,但基于

  1. 我不用 Unicode 储存资料。
  2. 我用 Unicode 储存资料,但不在乎 MySQL 在字符的处理上,是被当成了字节。

在不更动 server 的设定下,可以使用以下的做法让新版的 phpMyAdmin 可以来管理 MySQL 数据库:

编辑 phpMyAdmin 在 libraries 目录下的 select_lang.lib.php,

  1. 搜寻:
    'utf-8'        => 'utf8',

    改成:

    'utf-8'        => 'latin1',

    (搜寻的字串应该位于 $GLOBALS['mysql_charset_map'] 或 $mysql_charset_map 阵列之中)

  2. 储存即可。

参考网页

  1. 网站制作学习志: MySQL 中文编码彻底研究
  2. 酷学园: MySQL超出字段长度后仍能储存
  3. MySQL 的“SET NAMES xxx” 字符编码问题分析
  1. No comments yet.

  1. No trackbacks yet.

return top

%d 位部落客按了赞: