MySql字符集初探,MySql编码问题

by shinichi_wtn 2010-04-10 00:25

今天从一个大文本文件里导入数据到MySql数据库中,但是发现中文字段却没有值,在导入时换成其他编码后更是出现了乱码。因为用程序逐行读这个大文本文件的前几行是可以读出来中文的,于是觉得应该是MySql编码设置不对引起的。因此上网查阅了一些资料,了解了一些基本的东西。

MySql的字符编码可以在服务器数据库字段各种层次上定义,最底层是字段字符集,当数据库和各个字段建立好后,改变上层的字符集不会改变具体字段的字符集;当创建新的数据库和表时,则以上层的默认字符集作为其字符集。每个字符集对应许多Collation(”校对规则"),"校对规则"是在字符集内用于比较字符的一套规则,主要体现在比较和排序上,这里不讨论该属性。

服务器的默认字符集

首先,从全局上,MySql服务引擎可以设置数据库默认的编码集,在安装或者更改配置的时候可以设置,如果在安装的时候选择的默认,那么就是"Latin1”,如果我们的数据库基本上都有中文信息甚至多个国家语言,那么我们可以配置"my.ini"文件,更改默认编码集,即"default-character-set=utf8",如果只涉及中文,则可以改为"gbk"或者"gb2312"。配置好后重启MySql服务,之后创建数据库的默认字符集就是我们所重新配置的编码了。

数据库的默认字符集

然后,我们在建立新的数据库时可以选择与默认字符集不一样的字符集,比如系统数据库MySql就是utf8的。

创建具有指定字符集的数据库的SQL语句如下

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

单个表的默认字符集

其次,除了设置全局字符集之外,我们在新建每个表的时候可以指定其字符集

CREATE TABLE `temp` (
`column1` char(10) NOT NULL,
`column2` char(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312

如上语句新建一个表,并将其默认编码集设置为'gb2312'。同样,用Navicat客户端工具可以更佳方便的修改字符集属性

字段的字符集

最后,就是字段的字符集了,在新建或修改表属性时,可以在每个字段后面添加字符集属性,这样每个字段的字符集也能够区分开来,比如

CREATE TABLE `temp` (
`tempword` char(12) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312

上面语句创建了一个temp表,虽然表的默认字符集被设置为gb2312,但是我们同样可以指定字段的具体字符集,这里被设置为utf8。

一般数据库中含有charvarchartext等字段类型时需要考虑字符集因素对其产生的影响,如果每次在创建数据库时都选择默认,在处理多国文字时可能会产生乱码。不过由于MySql字符集设置是相当灵活的,我们可以很方便改变数据库、表、字段的字符集属性来使得数据库更佳真实可靠。

对MySql字符集有了初步了解后,我用程序获取了最开始所说的大文本文件的编码,是utf8的,于是我将所有含有中文的char字段的字符集属性改为了utf8,如此配置后,所有中文内容成功导入,不会出现导入空值或者乱码的情况。

(仅用于Gavatar)

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

shinichi_wtnI'm Shinichi_wtn

Software Engineering Manager at Microsoft

[More...]


Month List