sql >> Databáze >  >> RDS >> Mysql

MySQL, UTF-8 a Emoji znaky

Problém je v tom, zda má db srovnání necitlivé na diakritické znaménka. Dalším problémem jsou složené znaky, ï může být vyjádřeno buď jako jeden znak Unicode, nebo dva tvořící náhradní pár. Existují metody, jak převést řetězec do předem složeného nebo rozloženého tvaru:precomposedStringWith* a decomposedStringWith*.

Zdá se, že MySQL podporuje dvě formy unicode ucs2 (to je starší forma, která byla nahrazena utf16), což je 16 bitů na znak a utf8 až 3 bajty na znak. Špatnou zprávou je, že ani jeden formulář nebude podporovat znaky roviny 1, které vyžadují 17 bitů. (hlavně emotikony). Vypadá to, že MySQL 5.5.3 a vyšší také podporují utf8mb4, utf16 a utf32 podporují BMP a doplňkové znaky (čti emotikony). Viz Znakové sady MySQL Unicode .

Zde je nějaký kód a výsledky, které demonstrují různé reprezentace bajtů Unicode.
Unicode je 21bitový systém kódování.
UTF32 přímo reprezentuje body kódu a jasně ukazuje rozložené náhradní páry.
UTF8 a UTF16 vyžadují jeden nebo více bajtů k reprezentaci znaku 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]);

// Pro některé náhradní páry neexistuje žádná jiná forma

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

Výstup 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. Dotaz na kontrolu překrývajících se rozsahů na serveru SQL?

  2. MySql :Vyberte příkaz pomocí operátoru IN

  3. Migrace Azure Database for MySQL/MariaDB na On-Prem Server

  4. SQL Server replikace databáze