Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL, UTF-8 dan karakter Emoji

Masalahnya adalah apakah db memiliki perbandingan tidak sensitif diakritik. Masalah lainnya adalah karakter yang tersusun, dapat dinyatakan sebagai salah satu karakter unicode atau dua yang membentuk pasangan pengganti. Ada beberapa metode untuk mengonversi string ke bentuk yang telah dibuat sebelumnya atau didekomposisi:precomposedStringWith* dan decomposedStringWith*.

Tampaknya MySQL mendukung dua bentuk unicode ucs2 (yaitu bentuk lama yang digantikan oleh utf16) yaitu 16-bit per karakter dan utf8 hingga 3 byte per karakter. Berita buruknya adalah tidak ada bentuk yang akan mendukung karakter plane 1 yang membutuhkan 17 bit. (terutama emoji). Sepertinya MySQL 5.5.3 dan lebih tinggi juga mendukung utf8mb4, utf16, dan utf32 mendukung BMP dan karakter tambahan (baca emoji). Lihat Kumpulan Karakter Unicode MySQL .

Berikut adalah beberapa kode dan hasil untuk mendemonstrasikan representasi byte unicode yang berbeda.
Unicode adalah sistem pengkodean 21 bit.
UTF32 secara langsung mewakili poin kode dan dengan jelas mendemonstrasikan pasangan pengganti yang terurai.
UTF8 dan UTF16 memerlukan satu atau lebih byte untuk mewakili karakter 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]);

// Untuk beberapa pasangan pengganti tidak ada bentuk lain

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]);

Keluaran 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. Stempel waktu tanpa perubahan pada pembaruan

  2. Bagaimana cara menyimpan data UTF8mb4 dengan mysqldump?

  3. prosedur tersimpan mysql lebih lambat 20 kali dari kueri standar

  4. Memiliki batasan kunci Asing saat menghapus baris menggunakan gabungan dalam

  5. Bagaimana cara memperbarui tabel secara otomatis saat tabel lain diperbarui di server mysql yang berbeda?