sql >> Database teknologi >  >> RDS >> Mysql

MySQL, UTF-8 og Emoji-karakterer

Spørgsmålet er, om db'en har en diakritisk ufølsom sammenligning. Det andet problem er sammensatte tegn, ï kan udtrykkes som enten ét unicode-tegn eller to, der danner et surrogatpar. Der er metoder til at konvertere en streng til en præ-komponeret eller dekomponeret form:precomposedStringWith* og decomposedStringWith*.

Det ser ud til, at MySQL understøtter to former for unicode ucs2 (det er en ældre form, der blev erstattet af utf16), som er 16-bit pr. tegn og utf8 op til 3 bytes pr. tegn. Den dårlige nyhed er, at ingen af ​​formerne vil understøtte plan 1-tegn, som kræver 17 bit. (primært emoji). Det ser ud til, at MySQL 5.5.3 og nyere også understøtter utf8mb4, utf16 og utf32 understøtter BMP og supplerende tegn (læs emoji). Se MySQL Unicode-tegnsæt .

Her er lidt kode og resultater for at demonstrere de forskellige unicode-byte-repræsentationer.
Unicode er et 21 bit kodningssystem.
UTF32 repræsenterer kodepunkterne direkte og viser tydeligt dekomponerede surrogatpar.
UTF8 og UTF16 kræver en eller flere bytes for at repræsentere et unicode-tegn.

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

// For nogle surrogatpar er der ingen anden form

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

NSLog output:

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. Tilslutning af ODBC-applikationer til MySQL

  2. MySQL fletning af to felter fra to tabeller til ét felt i resultatsæt

  3. MySQL BLOB vs fil til lagring af små PNG-billeder?

  4. Sådan implementeres Teamcity med PostgreSQL for høj tilgængelighed