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>