mysql设置utf8字符集

mysql字符集含义请看mysql手册第10.1节Character Set Support

mysql的字符集转换过程请看鸟哥博客的这一篇

0. 初始状态

debian使用apt安装的mysql一开始是这样的

可以看到默认情况下

sever的字符集是latin1

db的字符集是latin1

mysql cli的client和connect的字符集是utf8

(pdo连接的client和connect的默认字符集是latin1)

1. server charset

server的字符集设置可以通过配置文件修改

vim /etc/mysql/my.cnf

在[mysqld]部分添加

character_set_server = utf8

重启mysql

可以看到server的默认字符集变成了utf8

2. db charset

设置server字符集后,数据库的默认字符集也变成了和server相同的utf8

此外,在修改server字符集的情况下,还可以通过创建数据库时指定字符集的方式设置数据库字符集

如下图,server和database的默认字符集都是latin1

创建数据库test

create database test character set utf8;

此时默认的server和db字符集仍是latin1

但是此时数据库test的默认字符集已经被修改为utf8

3.table charset

设置了数据库的字符集,表的字符集若未设置则使用数据库的字符集

此外,还可以在创建表时指定表的字符集

CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL DEFAULT ‘‘,
`email` varchar(64) NOT NULL DEFAULT ‘‘,
`age` tinyint(3) unsigned NOT NULL DEFAULT ‘0‘,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4. column charset

设置了表的字符集,表列的字符集默认使用表的字符集

此外,还可以在创建表时指定列的字符集

CREATE TABLE `user2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT ‘‘,
`email` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT ‘‘,
`age` tinyint(3) unsigned NOT NULL DEFAULT ‘0‘,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下图可见,表字符集为utf8,列字符集为latin1

5.conect charset

客户端和连接的字符集需要在客户端设置,否则默认为latin1

$dsn = ‘mysql:host=127.0.0.1;dbname=test‘;
$user = ‘root‘;
$password = ‘root‘;
$pdo = new PDO($dsn, $user, $password);
$name = $_GET[‘name‘];
$email = $_GET[‘email‘];
$age = $_GET[‘age‘];
$sql = ‘insert into user (name,email,age) values (:name,:email,:age)‘;
$stmt = $pdo->prepare($sql);
$stmt->bindParam(‘:name‘, $name, PDO::PARAM_STR);
$stmt->bindParam(‘:email‘, $email, PDO::PARAM_STR);
$stmt->bindParam(‘:age‘, $age, PDO::PARAM_INT);
$stmt->execute();

通过访问

http://www.test.com/?name=你好&[email protected]&age=20

执行上述代码,在mysql cli的字符集为utf8时name显示乱码,

客户端在连接到mysql后,执行

set names utf8;

php代码中表示为

5.1

$pdo = new PDO($dsn, $user, $password);
$pdo->exec(‘set names utf8‘);

再次访问url,可见连接字符集已设置为utf8

此外,还可以通过pdo连接时设置字符集

5.2

$dsn = ‘mysql:host=127.0.0.1;dbname=test;charset=utf8‘;
$user = ‘root‘;
$password = ‘root‘;
$pdo = new PDO($dsn, $user, $password);

以及这样

5.3

$attr = array(PDO::MYSQL_ATTR_INIT_COMMAND => ‘SET NAMES UTF8‘);
$pdo = new PDO($dsn, $user, $password, $attr);

参考资料

msyql手册 http://dev.mysql.com/doc/refman/5.5/en/charset.html

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

stackoverflow http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names

http://stackoverflow.com/questions/18496557/pdo-utf-8-encoding-issue

时间: 2024-12-25 03:41:05

mysql设置utf8字符集的相关文章

为 MySQL 设置默认字符集(UTF-8)避免产生乱码

环境:Windows 7+Wamp Server+MySQL 5.7.9 查看MySQL默认编码: SHOW VARIABLES LIKE 'character%' character_set_client为客户端编码方式 character_set_connection为建立连接使用的编码 character_set_database数据库的编码 character_set_results结果集的编码 character_set_server数据库服务器的编码 只要保证统采用的编码方式一致,就

《Mycat学习笔记》 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。

其实这个番外篇比较无聊——即客户端为lantin字符集,后面MySQL为U8字符集,MyCat在中间到底会起什么作用. 再说下本次验证的环境: Mac OS 10.11.2 MySQL 5.6 MyCat 1.5 OK,开始我们的验证工作. 1) 由于数据库与操作系统已被默认设置为U8编码,计划通过修改Mysql  “character_set_client” 参数调整客户端字符集配置进行验证. 关于MYSQL字符集较全面的介绍,请参考 <mysql_query("set names gb

MySQL设置各类字符集

一.查看字符集编码: 登录mysql show variables like '%character%'; 二.修改编码: 编辑/etc/my.cnf ,设置后的配置文件如下: [[email protected] /]# cat /etc/my.cnf [mysql]default-character-set=utf8[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbo

mysql 设置 utf-8

 show variables like '%character%';    +--------------------------+----------------------------+ | Variable_name            | Value                      | +--------------------------+----------------------------+ | character_set_client     | utf8    

数据库 - MySQL设置utf-8编码

1. 在Windows上,安装时请选择UTF-8编码,以便正确地处理中文. 在Mac或Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8.MySQL的配置文件默认存放在/etc/my.cnf或者/etc/mysql/my.cnf: [client] default-character-set = utf8 [mysqld] default-storage-engine = INNODB character-set-server = utf8 2. 之后用sudo s

mysql中utf8和utf8mb4区别

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换.当然,为了节省空间,一般情况下使用utf8也就够了. 二.内容描述 那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了.三个字节的 UTF-8 最

mysql中通过my.cnf设置默认字符集utf-8

选项配置 配置文件路径:/full/path/mysql/bin/my.cnf (默认为/etc/my.cnf ) [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf

设置mariadb字符集为utf8

我用的是10.0.25 mariadb,     在centos7系统上,用以下指令设置数据库字符集. [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 init_connect='SET collation_connection=utf8-unicode_ci' init_connect='SET NAMES  utf8' colla

mysql设置字符 UTF-8

Windows版MySQL设置字符集全部为utf8的方式 MySQL安装目录下的my.ini文件 [client]节点 default-character-set=utf8    (增加) [mysql]节点 default-character-set=utf8    (修改) [mysqld]节点 default-character-set=utf8    (修改) character_set_server=utf8    (增加) 修改完毕后使用 net stop mysql net sta