2011-08-28 54 views
1

manual明確指出「ucs2不能用作客戶端字符集,這意味着它不適用於SET NAMES或SET CHARACTER SET」。那麼我怎樣才能插入,例如,代碼點U + 2193?我正在使用PHP 5.3 + PDO。如何在PHP中使用PHP PDO插入UCS-2數據?

+0

你可能會逃避使用UTF-16。大多數代碼點是相同的。 –

+1

如何使用UTF-8呢? – Svish

回答

2

如果你想使用Unicode與MySQL服務器通信,你唯一的選擇是使用UTF-8。

如果您現在正在使用PHP中的UCS-2或UTF-16字符串,則在嘗試存儲它們之前,必須將它們轉換爲UTF-8。另外請注意,如果您將客戶端字符集設置爲MySQL,則MySQL將返回UTF-8,因此如果您承諾在PHP端使用UCS-2,則還需要轉換查詢結果。 (如果你有能力做出更大的改變,那麼在使用UTF-8的任何地方都可能比做所有這些額外的轉換更好。)

至於存儲代碼點U + 2193,不用擔心: UTF-8可以表示每個Unicode碼點(在這個特定情況下,它將是0xE2 0x86 0x93)。

從技術上講,這是捏造了一點,因爲MySQL的utf8ucs2字符集只包括Unicode的一個子集稱爲基本多文種平面(BMP)。 Unicode字符集的世界是expanded in MySQL 5.5超出BMP的範圍,但仍不能使用ucs2,新的utf16utf32字符集作爲客戶端字符集,使您仍然堅持使用UTF-8。

+0

好吧,好吧,但爲什麼MySQL有一個ucs2字符集(和排序規則),如果你不能使用它們? – chx

+0

如果您有合理的理由(可能是大塊的CJK?),您可以將數據存儲在這些編碼中。你不能讓數據庫服務器和客戶端相互交談。只要雙方達成一致,並且它涵蓋了應用程序需要的所有字符(UTF總是會這樣),那麼對客戶端 - 服務器鏈接使用何種編碼應該不重要。 – bobince

+0

UTF-16在許多\ * ix世界中都是二等公民,包括MySQL和PHP。你確定*你真的在PHP中使用UTF-16/UCS-2數據嗎?它提供了很少的工具來處理這種編碼中的字節字符串。你更可能使用更合理的編碼UTF-8。 – bobince

0

後代,CREATE TABLE test (encoding varchar(255) CHARACTER SET ucs2);然後INSERT INTO test VALUES (1, CHAR(0x2193));。如果我運行SELECT * FROM test,我會看到一個向下箭頭。

+0

請注意,除非您將'character_set_results'設置爲binary或ucs2,否則MySQL將自動將您的結果轉換爲另一種編碼,即使它們存儲爲UCS-2。 –