mysql設置utf8字符集

mysql字符集含義請看mysql手冊第10.1節Character Set Supportphp

mysql的字符集轉換過程請看鳥哥博客的這一篇html

 

0. 初始狀態

debian使用apt安裝的mysql一開始是這樣的mysql

charset1

能夠看到默認狀況下sql

sever的字符集是latin1數據庫

db的字符集是latin1vim

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

(pdo鏈接的client和connect的默認字符集是latin1)3d

 

1. server charset

server的字符集設置能夠經過配置文件修改server

vim /etc/mysql/my.cnf

 

在[mysqld]部分添加htm

character_set_server = utf8

 

重啓mysql

能夠看到server的默認字符集變成了utf8

server

 

2. db charset

設置server字符集後,數據庫的默認字符集也變成了和server相同的utf8

此外,在修改server字符集的狀況下,還能夠經過建立數據庫時指定字符集的方式設置數據庫字符集

以下圖,server和database的默認字符集都是latin1

db1

 

建立數據庫test

create database test character set utf8;

 

此時默認的server和db字符集還是latin1

db2

可是此時數據庫test的默認字符集已經被修改成utf8

db3

 

3.table charset

設置了數據庫的字符集,表的字符集若未設置則使用數據庫的字符集

table

此外,還能夠在建立表時指定表的字符集
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

設置了表的字符集,表列的字符集默認使用表的字符集

col1

 

此外,還能夠在建立表時指定列的字符集

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 col2

 

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=123@test.com&age=20

執行上述代碼,在mysql cli的字符集爲utf8時name顯示亂碼,

connect

 

客戶端在鏈接到mysql後,執行

set names utf8;

 

php代碼中表示爲

5.1

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

 

再次訪問url,可見鏈接字符集已設置爲utf8

connect2

 

 

此外,還能夠經過pdo鏈接時設置字符集

5.2

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

 

connect3

 

以及這樣

5.3

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

 

 

參考資料

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

相關文章
相關標籤/搜索