2012-03-01 16 views
10

Chúng tôi đang phát triển một ứng dụng iPhone có thể gửi biểu tượng cảm xúc từ iPhone sang phía máy chủ PHP và chèn vào bảng MySQL. Tôi đang làm công việc phía máy chủ.Biểu tượng cảm xúc iPhone chèn vào MySQL nhưng trở thành giá trị trống

Nhưng sau khi chèn câu lệnh được thực hiện thành công, giá trị được chèn sẽ bị trống.
Những gì tôi có thể chèn vào trường (varchar) chính xác là văn bản, nhưng một khi bao gồm biểu tượng cảm xúc,
chỉ văn bản có thể được chèn vào và biểu tượng cảm xúc sẽ được cắt tự động.

Ai đó cho tôi lời khuyên về việc đặt loại trường thành Blog để có thể lưu trữ dữ liệu hình ảnh.
Nhưng giá trị được chèn không phải lúc nào cũng bao gồm cả biểu tượng cảm xúc và kích thước nhỏ.

* Tôi đang sử dụng mysql_real_escape_string để chèn giá trị.

+0

hiển thị cho chúng tôi câu lệnh chèn –

+0

Câu trả lời ngắn: Bạn phải sử dụng 'utf8mb4' trong MySQL. –

Trả lời

22

Hầu hết các biểu tượng cảm xúc trên iOS sử dụng các điểm mã phía trên Mặt phẳng đa ngôn ngữ cơ bản của bảng Unicode. Ví dụ, (MẶT TRỜI MẶT MẮT VÀ MẮT MẮT) là tại U + 1F604.

OS X character viewer

Bây giờ, xem http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html.

MySQL trước phiên bản 5.5 chỉ hỗ trợ UTF-8 cho BMP, bao gồm ký tự giữa U + 0000 và U + FFFF (nghĩa là chỉ một tập hợp con thực tế UTF-8; utf8 của MySQL không phải là UTF-8 thực). Nó không thể lưu trữ ký tự tại điểm mã U + 1F604 hoặc các "ký tự cao" tương tự khác. MySQL 5.5+ hỗ trợ utf8mb4 (thực tế UTF-8), utf16utf32, có thể mã hóa các ký tự này. Nếu bạn đang sử dụng MySQL 5.5+, hãy sử dụng một trong các bộ ký tự cột này và đảm bảo bạn đang sử dụng cùng một bộ ký tự cho mã hóa kết nối của bạn đến/từ PHP. Nếu bạn đang sử dụng MySQL < 5.5, bạn sẽ phải sử dụng loại cột BLOB. Loại đó lưu trữ các byte thô mà không quan tâm đến các "ký tự" trong đó. Nhược điểm là bạn sẽ không thể tìm kiếm hoặc lập chỉ mục văn bản một cách hiệu quả.

+0

Cảm ơn bạn đã trả lời. Phiên bản MySQL mà chúng ta đang sử dụng bây giờ là _5.1.54 _... Vì vậy, tôi sẽ thử kiểu dữ liệu blob hoặc nâng cấp lên _5.5_ và sử dụng 'utf8mb4' cho trường của tôi. Tôi sẽ quay lại sau;) –

+0

Cảm ơn bạn @ lừa. Những gì tôi vừa xác nhận bây giờ là các biểu tượng cảm xúc sẽ được lưu trữ một cách chính xác sau khi đã thay đổi kiểu trường từ varchar thành blob trong MySQL _5.1.54_ của chúng ta. Chúng tôi đang thảo luận về những gì nên áp dụng cho phía máy chủ của chúng tôi vì một số cấu hình sẽ được thay đổi trong mã php (hoặc khung công tác CakePHP). –

+1

Cuối cùng, chúng tôi nâng cấp lên ** 5.5 + ** và biểu tượng cảm xúc được hiển thị bình thường, để nó có thể tương thích với sự phát triển tương lai của chúng tôi. Cảm ơn bạn một lần nữa, @deceze. –

1

Một số ký tự biểu tượng cảm xúc hoạt động với cấu hình mysql cũ không có màu sắc vì chúng được mã hóa bằng cách sử dụng một codepoint 3 byte và mysql có thể lưu trữ ký tự 3 byte. Nếu bạn không thể nâng cấp mysql cũng không sử dụng blobs vì bất kỳ lý do gì, bạn có thể chà ra các điểm mã hóa 4 byte và giữ các byte 3 byte.

Nếu máy tính của bạn có khả năng biểu tượng cảm xúc, đây là một danh sách các ký tự emoji 3 byte iOS:

☺❤✨❕❔✊✌✋☝☀☔☁⛄⚡☎➿✂⚽⚾⛳ ♠ ♥ ♣ ♦ 〽☕⛪⛺⛲⛵✈⛽⚠♨1⃣2⃣3⃣4⃣5⃣6⃣7⃣8⃣9⃣0⃣ # ⃣⬆⬇⬅➡↗↖↘↙ ◀ ▶ ⏪⏩♿㊙㊗✳✴♈♉♊♋♌♍♎♏♐♑♒♓⛎⭕❌ © ® ™