2014年7月25日 星期五

[MySQL]多種字符編碼同時顯示的問題

        目前字符集是utf8
            
show variables like '%char%';


        建立測試資料表

DROP TABLE IF EXISTS `unicode_test`;

CREATE TABLE `unicode_test` (
  `t1` int(11) NOT NULL AUTO_INCREMENT,
  `t2` varchar(64) NOT NULL,
  PRIMARY KEY (`t1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;

        插入一筆亂碼資料看看
insert into unicode_test (t2) values ('我是奇怪文嬗');

        果然顯示亂碼
select * from unicode_test;


        要正常顯示很簡單,設成latin1字符集,但這是因為我知道我插入的是甚麼字符集的文字

set names latin1;

select * from unicode_test;

        查看一下字符集設定,真的都變latin1

show variables like '%char%';



        接著還原設定,插入其他測試資料,有英文、簡中與繁中字

set names utf8;

insert into unicode_test (t2) values ('abced');
insert into unicode_test (t2) values ('简体炼数');
insert into unicode_test (t2) values ('繁體中文');

        查看一下,英文、簡中與繁中字都正常顯示,但第一筆亂碼還是亂碼

select * from unicode_test;

        試試剛剛的做法改一下字符集,結果更慘

set names latin1;
select * from unicode_test;

        那怎麼解呢?先還原

set names utf8;

        然後針對亂碼那筆作轉換即可,很簡單吧

select t1,
     (case when t1 = 1 then convert(binary convert(t2 using latin1) using utf8) else t2 end) t2_str
from unicode_test;


        如過是latin1呢,一樣可以轉換

set names latin1;

select t1, (case when t1 >  1 then convert(binary t2 using latin1) else t2 end) t2_str from unicode_test;


        想知道怎麼插入亂碼字嗎?如下

insert into unicode_test (t2) values (CONVERT(BINARY '我轉轉賺' USING latin1));
select t1,
     (case when (t1 = 1 or t1 = 5) then convert(binary convert(t2 using latin1) using utf8) else t2 end) t2

from unicode_test;


        話說這可是真實案例啊!

0 意見:

張貼留言