您的位置:首页 > 数据库 > MySQL

mysql 编码问题总结

2012-12-24 22:20 417 查看
其实要弄清楚mysql编码问题,关键在于弄清以下几个方面,其中的修改方式在下面的两个链接中:

A、mysql默认编码。

B、数据库、表和字段的默认编码。

C、显示端默认编码。(这里特别指出,终端下默认编码不是gbk,想在终端显示中文时,只需要运行下set names gbk;就可以了)

D、对于中文,GBK和utf8都可以。

(1)/article/10506051.html

最近向MySQL数据库插入数据时出现了一个问题,报告中文错误:incorrect string value .....在网上搜了一些资料也都是宽泛的说说,自己综合各家之长,试了试,发现把数据库编码、页面编码和Java文件编码修改成统一的编码方案就行了。

 在MySQL命令窗口下输入\s就可以查看当前数据库的编码了。

 修改方法

页面和Java文件中的修改就不说了,大家肯定都会,只说说怎样修改MySQL的吧。

修改数据库编码的命令是:ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

 修改表的编码的命令是:ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

 修改表中字段的编码的命令是:ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL

修改MySQL默认编码方案,在windows环境下可以直接用Mysql Server Instance Config Wizard 进行设置

Linux环境下

/etc/init.d/mysql start (stop) 为启动和停止服务器

  /etc/mysql/ 主要配置文件所在位置 my.cnf

  /var/lib/mysql/ 放置的是数据库表文件夹,这里的mysql相当于windows下mysql的date文件夹

  启动mysql后,以root登录mysql

  isher@isher-ubuntu:~$ mysql -u root

  >show variables like 'character%'; #执行编码显示

  +--------------------------+----------------------------+

  | Variable_name | Value |

  +--------------------------+----------------------------+

  | character_set_client | latin1 |

  | character_set_connection | latin1 |

  | character_set_database | latin1 |

  | character_set_filesystem | binary |

  | character_set_results | latin1 |

  | character_set_server | latin1 |

  | character_set_system | utf8 |

  | character_sets_dir | /usr/share/mysql/charsets/ |

  +--------------------------+----------------------------+

  在某些时候,我们续要修改mysql默认数据库的编码,以保证某些迁移的程序可以正常显示,编辑my.cnf文件进行编码修改,windows可以直接用Mysql Server Instance Config Wizard 进行设置

  在linux下修改3个my.cnf的1个/etc/mysql/my.cnf文件

  找到客户端配置[client] 在下面添加

  default-character-set=utf8 默认字符集为utf8

  在找到[mysqld] 添加

  default-character-set=utf8 默认字符集为utf8

  init_connect='SET NAMES utf8' (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

  修改好后,重新启动mysql 即可,查询一下show variables like 'character%';

  +--------------------------+----------------------------+

  | Variable_name | Value |

  +--------------------------+----------------------------+

  | character_set_client | utf8 |

  | character_set_connection | utf8 |

  | character_set_database | utf8 |

  | character_set_filesystem | binary |

  | character_set_results | utf8 |

  | character_set_server | utf8 |

  | character_set_system | utf8 |

  | character_sets_dir | /usr/share/mysql/charsets/ |

  +--------------------------+----------------------------+

  此方法用于标准mysql版本同样有效,对于/etc/my.cnf文件,需要从mysql/support-files的文件夹cp my-large.cnf一份到/etc/my.cnf。

(2)

windows中mysql5.5.10默认字符集修改,字符编码设置,中文乱码,gb2312,gbk,utf8格式存储数据

通过修改mysql默认字符集,可以存储中文数据,以免出现中文乱码,以下以设置为utf8为例。

=================================================================================

以下内容是在本机安装的mysql-5.5.10上,没有修改my.ini前显示结果

===================================================================================

mysql> show variables like 'character%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | gbk |

| character_set_connection | gbk |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | gbk |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | D:\mysql-5.5.10\share\charsets\ |

+--------------------------+---------------------------------+

8 rows in set (0.02 sec)

mysql> show variables like 'collation%';

+----------------------+-------------------+

| Variable_name | Value |

+----------------------+-------------------+

| collation_connection | gbk_chinese_ci |

| collation_database | latin1_swedish_ci |

| collation_server | latin1_swedish_ci |

+----------------------+-------------------+

3 rows in set (0.00 sec)

==============================================================================

关闭mysql服务,在mysql安装目录下,my.ini文件进行如下修改,没有则直接进行添加

==============================================================================

[client]

#修改客户端默认字符编码格式为utf8

default-character-set=utf8

[mysqld]

#修改服务器端默认字符编码格式为utf8

character-set-server = utf8

=============================================================================

修改后,再次输入命令查看,显示结果如下

==============================================================================

mysql> show variables like 'character%';

+--------------------------+---------------------------------+

| Variable_name | Value |

+--------------------------+---------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | D:\mysql-5.5.10\share\charsets\ |

+--------------------------+---------------------------------+

8 rows in set (0.00 sec)

mysql> show variables like 'collation%';

+----------------------+-----------------+

| Variable_name | Value |

+----------------------+-----------------+

| collation_connection | utf8_general_ci |

| collation_database | utf8_general_ci |

| collation_server | utf8_general_ci |

+----------------------+-----------------+

3 rows in set (0.00 sec)

================================================================================

查看mysql已经安装的所有字符集,也就是在mysql中可以使用的字符集,结果如下

================================================================================

mysql> show character set;

+----------+-----------------------------+---------------------+--------+

| Charset | Description | Default collation | Maxlen |

+----------+-----------------------------+---------------------+--------+

| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |

| dec8 | DEC West European | dec8_swedish_ci | 1 |

| cp850 | DOS West European | cp850_general_ci | 1 |

| hp8 | HP West European | hp8_english_ci | 1 |

| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |

| latin1 | cp1252 West European | latin1_swedish_ci | 1 |

| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |

| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |

| ascii | US ASCII | ascii_general_ci | 1 |

| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |

| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |

| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |

| tis620 | TIS620 Thai | tis620_thai_ci | 1 |

| euckr | EUC-KR Korean | euckr_korean_ci | 2 |

| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |

| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |

| greek | ISO 8859-7 Greek | greek_general_ci | 1 |

| cp1250 | Windows Central European | cp1250_general_ci | 1 |

| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |

| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |

| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |

| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |

| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |

| cp866 | DOS Russian | cp866_general_ci | 1 |

| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |

| macce | Mac Central European | macce_general_ci | 1 |

| macroman | Mac West European | macroman_general_ci | 1 |

| cp852 | DOS Central European | cp852_general_ci | 1 |

| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |

| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |

| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |

| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |

| cp1256 | Windows Arabic | cp1256_general_ci | 1 |

| cp1257 | Windows Baltic | cp1257_general_ci | 1 |

| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |

| binary | Binary pseudo charset | binary | 1 |

| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |

| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |

| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |

+----------+-----------------------------+---------------------+--------+

39 rows in set (0.00 sec)

===============================================================================

经过所有以上设置以后,mysql中所有字符集都是utf8的了,但是在控制台操作的时候,还是会出现乱码中文乱码。

这是因为windows XP的控制台窗口默认显示字符编码格式为gbk,所以这里要设置显示结果使用的字符编码格式为utf8。

每次在控制台进行操作的时候,都要进行如下这个设置,结果才能正常显示中文

===============================================================================

mysql> set character_set_results='gbk';

Query OK, 0 rows affected (0.00 sec)

===============================================================================

一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。

问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

===============================================================================

mysql> set names gbk;

Query OK, 0 rows affected (0.00 sec)

它相当于下面的三句指令:

SET character_set_client = utf8;

SET character_set_results = utf8;

SET character_set_connection = utf8;

因此,这个方法也可以解决所有字符编码设置为utf8,而控制台显示中文乱码的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: