Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các ký tự MySQL, UTF-8 và Biểu tượng cảm xúc

Vấn đề là ướt hơn db có một so sánh không nhạy cảm dấu phụ. Vấn đề khác là các ký tự được tạo thành, ï có thể được thể hiện dưới dạng một hoặc hai ký tự unicode tạo thành một cặp thay thế. Có các phương pháp để chuyển đổi một chuỗi thành dạng được soạn trước hoặc phân tách:precomposedStringWith * và phân táchStringWith *.

Có vẻ như MySQL hỗ trợ hai dạng unicode ucs2 (đó là dạng cũ hơn đã được thay thế bởi utf16) là 16-bit cho mỗi ký tự và utf8 lên đến 3 byte cho mỗi ký tự. Tin xấu là không có biểu mẫu nào sẽ hỗ trợ các ký tự máy bay 1 yêu cầu ở 17 bit. (chủ yếu là biểu tượng cảm xúc). Có vẻ như MySQL 5.5.3 trở lên cũng hỗ trợ utf8mb4, utf16 và utf32 hỗ trợ BMP và các ký tự bổ sung (đọc biểu tượng cảm xúc). Xem Bộ ký tự Unicode của MySQL .

Dưới đây là một số mã và kết quả để chứng minh các biểu diễn byte unicode khác nhau.
Unicode là hệ thống mã hóa 21 bit.
UTF32 đại diện trực tiếp cho các điểm mã và thể hiện rõ ràng các cặp thay thế được phân tách.
UTF8 và UTF16 yêu cầu một hoặc nhiều byte để đại diện cho một ký tự unicode.

NSLog(@"character: %@", @"Å");
NSLog(@"decomposedStringWithCanonicalMapping UTF8:  %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"decomposedStringWithCanonicalMapping UTF16: %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"decomposedStringWithCanonicalMapping UTF32: %@", [[@"Å" decomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF32BigEndianStringEncoding]);

NSLog(@"precomposedStringWithCanonicalMapping UTF8:  %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"precomposedStringWithCanonicalMapping UTF16: %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"precomposedStringWithCanonicalMapping UTF32: %@", [[@"Å" precomposedStringWithCanonicalMapping] dataUsingEncoding:NSUTF32BigEndianStringEncoding]);

NSLog(@"character: %@", @"😱");
NSLog(@"dataUsingEncoding UTF8:  %@", [@"😱" dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"dataUsingEncoding UTF16: %@", [@"😱" dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"dataUsingEncoding UTF32: %@", [@"😱" dataUsingEncoding:NSUTF32BigEndianStringEncoding]);

// Đối với một số cặp thay thế, không có dạng nào khác

NSString *aReverse = [[NSString alloc] initWithBytes:"\xD8\x3C\xDD\x70\x00" length:4 encoding:NSUTF16BigEndianStringEncoding];
NSLog(@"character: %@", aReverse);
NSLog(@"dataUsingEncoding UTF8:  %@", [aReverse dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"dataUsingEncoding UTF16: %@", [aReverse dataUsingEncoding:NSUTF16BigEndianStringEncoding]);
NSLog(@"dataUsingEncoding UTF32: %@", [aReverse dataUsingEncoding:NSUTF32BigEndianStringEncoding]);

Đầu ra NSLog:

character: Å
decomposedStringWithCanonicalMapping UTF8:  <41cc8a>   
decomposedStringWithCanonicalMapping UTF16: <0041030a>   
decomposedStringWithCanonicalMapping UTF32: <00000041 0000030a>   

precomposedStringWithCanonicalMapping UTF8:  <c385>   
precomposedStringWithCanonicalMapping UTF16: <00c5>   
precomposedStringWithCanonicalMapping UTF32: <000000c5>   

character: 😱
dataUsingEncoding UTF8:  <f09f98b1>   
dataUsingEncoding UTF16: <d83dde31>   
dataUsingEncoding UTF32: <0001f631>   

character: 🅰
dataUsingEncoding UTF8:  <f09f85b0>
dataUsingEncoding UTF16: <d83cdd70>
dataUsingEncoding UTF32: <0001f170>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để xem các truy vấn MySQL trực tiếp?

  2. InnoDB có bảng tĩnh không?

  3. Lưu trữ tệp cho ứng dụng web:Hệ thống tệp so với công cụ DB và NoSQL

  4. php sql multi bind_param

  5. Symfony2 Doctrine chạy SQL từ một tệp trong CLI