读书人

msyql中文乱码有关问题

发布时间: 2013-03-06 16:20:31 作者: rapoo

msyql中文乱码问题

参考:http://hi.baidu.com/ayongs/item/30f784122c8d51a5ffded509

http://www.2cto.com/database/201108/101151.html

http://www.laruence.com/2008/01/05/12.html

mysql5.1参考手册

一.mysql字符集

MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。 字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。

  MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:

  character_set_client     客户端字符集

  character_set_connection   客户端与服务器端连接采用的字符集

  character_set_results     SELECT查询返回数据的字符集

  character_set_database    数据库采用的字符集

在服务器级别,确定方法很简单。当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。如:mysqld --default-character-set=utf8,如果启动mysql时没有指定 --default-character-set选项,那么默认的服务器级字符集为编译mysql时指定的字符集,由configure时的:--with-charset和--with-collation选项确实,默认的字符集为latin1.


每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:

CREATE DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]
如 create database ulogd default character set utf8;

如果创建数据库时没用指定字符集,那么该数据库默认的字符集为当前服务器所使用的字符集。


每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:

CREATE TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
如果创建表时没有指定表的字符集,那么该表字符集为当前数据库所使用的字符集。


每一个“

msyql中文乱码有关问题

查看某个数据库,某个表,某一个字符列当前使用的字符集,命令如下:

1. status (选择某个数据库之后再执行)

2. show variables like 'char%' (选择某个数据库之后再执行)

3. show create database database_name

4. show create table table_name

5 show full columns from table_name

如果根据这些查看,每个阶段的转换字符集都兼容,但还是出现了乱码,那么请确定,你是否在插入数据之后再更改了数据库的字符集设置。

修改字符集的设置:

第一种:在/etc/my.cnf 文件中

[client] 下加入

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

[mysqld] 下加入

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

第二种:在登录msyql后修改

mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;

一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

重要的有二两点:
1) 正确的设定数据库编码.MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8,那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集)
2) 正确的设定数据库connection编码.设置好数据库的编码后,在连接数据库时候,应该在连接字符串中指定客户端的编码,比如使用jdbc连接时,指定连接为utf8方式.

对于用C语言连接mysql如果没有在连接字符串中指定编码,那中文很有可能会出现乱码!!

C语言用 mysql_options 或者mysql_set_character_set指定字符集


另附常用的mysql命令:http://www.cppblog.com/zzg/archive/2009/05/29/86066.html

mysql -u ulogd -pulogd #登录数据库,用户名为ulogd,密码为ulogd
show databases; #查看有哪些数据库
use ulogd; #选择一个数据库ulogd
show tables; #查看当前数据库的数据表
describe ulog2; #查看数据表ulog2的结构
quit; #退出数据库

查看存储过程(用root用户执行)
show procedure status;
select `name` from mysql.proc where db = 'ulogd' and (type = 'function' or type = 'procedure');
注意,这里的name左右的是反引号,而不是单引号


查看存储过程或函数的创建代码
show create procedure proc_name;
show create function func_name;
创建数据库
echo "create database ulogd character set utf8;" | mysql -u root -proot

导入脚本
/usr/local/mysql/bin/mysql -u root -proot -D ulogd < ./doc/mysql-ulogd2.sql
添加一个用户,并设置权限
echo "grant create, insert, select, delete, update on ulogd.* to ulogd@localhost identified by 'ulogd'" | /usr/local/mysql/bin/mysql -u root -proot

查看当前状态:status

读书人网 >其他数据库

热点推荐