sql >> Databasteknik >  >> RDS >> Mysql

MySQL, UTF-8 och Emoji-tecken

Frågan är om db har en diakritiskt okänslig jämförelse. Den andra frågan är sammansatta tecken, ï kan uttryckas som antingen ett unicode-tecken eller två som bildar ett surrogatpar. Det finns metoder för att konvertera en sträng till en förkomponerad eller dekomponerad form:precomposedStringWith* och decomposedStringWith*.

Det verkar som att MySQL stöder två former av unicode ucs2 (det är en äldre form som ersattes av utf16) som är 16-bitar per tecken och utf8 upp till 3 byte per tecken. Den dåliga nyheten är att ingendera formen kommer att stödja plan 1-tecken som kräver 17 bitar. (främst emoji). Det ser ut som att MySQL 5.5.3 och uppåt också stöder utf8mb4, utf16 och utf32 stöder BMP och kompletterande tecken (läs emoji). Se MySQL Unicode-teckenuppsättningar .

Här är lite kod och resultat för att demonstrera de olika unicode-byte-representationerna.
Unicode är ett 21-bitars kodningssystem.
UTF32 representerar kodpunkterna direkt och visar tydligt nedbrutna surrogatpar.
UTF8 och UTF16 kräver en eller flera byte för att representera ett unicode-tecken.

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

// För vissa surrogatpar finns det ingen annan 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-utgång:

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. Hur skapar jag en sekvens i MySQL?

  2. Jag måste skapa en vy som förenar de tre tabellerna, inklusive alla poster från student- och kurstabeller (visas nedan)

  3. beskriv frågan med oracle (.Net Connector)

  4. Hur man tar sig runt Slick 3.0-schemaskapande får fel på grund av nyckelspecifikationer utan längd