2010-11-23 48 views
6

有沒有一種方法可以指定MySQL中的Unicode字符文字?MySQL中的Unicode(十六進制)字符文字

我想用一個ASCII字符,像下面的東西來取代一個Unicode字符:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y") 

但我使用更加晦澀字符,這是不是在大多數字體中可用的,所以我想能夠使用Unicode字符文字,像

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y") 

此SQL語句正在從一個PHP腳本調用 - 第一種形式不僅是不可讀的,但它實際上並沒有工作!

回答

3

感謝您的建議,但我認爲這個問題是更久遠的系統。

有很多的層次來拆洗,但據我所知道的,命令

set names utf8 

(此服務器至少上)做了正確的UTF-8處置工作,而

set character set utf8 

沒有。

在我的環境中,這些都是使用PDO從PHP調用的,可能會產生什麼不同。

無論如何,謝謝!

0

如您所見,MySQL字符串語法被指定爲here,沒有提供數字轉義序列。

但是,由於您正在將PHP嵌入到PHP中,因此可以使用PHP計算正確的字節。確保你放入SQL的字節實際上匹配你的client character set

2

您可以使用hexunhex功能,例如:

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3')) 
0

還有char function將允許你想要的東西(提供字節數和字符集名稱)並獲得一個字符。

3

可以使用0xx'',或X''指定hexadecimal literals(甚至binary literals):

select 0xC2A2; 
select x'C2A2'; 
select X'C2A2'; 

注意,返回類型是一個二進制字符串,因此每一個字節被視爲字符。你可以用char_length驗證這一點:

select char_length(0xC2A2) 

2

如果你想UTF-8字符串時,需要使用convert

select convert(0xC2A2 using utf8mb4) 

而且我們可以看到,C2 A2是考慮UTF-8中的1個字符:

select char_length(convert(0xC2A2 using utf8mb4)) 

1


而且,你不必擔心無效字節,因爲convert會自動將其刪除:

select char_length(convert(0xC1A2 using utf8mb4)) 

0

可以看出,輸出爲0,因爲C1 A2是無效的UTF-8字節序列。

相關問題