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%';
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;
set names latin1;
select * from unicode_test;
那怎麼解呢?先還原
set names utf8;
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 意見:
張貼留言