Mysql
 sql >> база данни >  >> RDS >> Mysql

Знаци MySQL, UTF-8 и Emoji

Проблемът е дали db има диакритично нечувствително сравнение. Другият проблем са съставените знаци, ï може да се изрази като един уникод знак или два, образуващи сурогатна двойка. Има методи за преобразуване на низ в предварително съставена или разложена форма:precomposedStringWith* и decomposedStringWith*.

Изглежда, че MySQL поддържа две форми на unicode ucs2 (това е по-стара форма, която беше заменена от utf16), която е 16 бита на символ и utf8 до 3 байта на знак. Лошата новина е, че нито една от двете форми няма да поддържа знаци от равнина 1, които изискват 17 бита. (главно емотикони). Изглежда, че MySQL 5.5.3 и по-нови също поддържат utf8mb4, utf16 и utf32 поддържат BMP и допълнителни символи (четете емотикони). Вижте MySQL Unicode набори от символи .

Ето малко код и резултати за демонстриране на различните представяния на байтове в Unicode.
Unicode е 21-битова кодираща система.
UTF32 директно представя кодовите точки и ясно демонстрира разложени сурогатни двойки.
UTF8 и UTF16 изискват един или повече байта за представяне на уникод знак.

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

// За някои сурогатни двойки няма друга форма

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:

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. Mysql ограничения за индексиране на пълен текст?

  2. MySQL- Wamp сървърът не работи след надстройка на win10

  3. Операторът MySQL по-голямо или равно на игнорира своето или равно на задължение

  4. MySQL добавя дни към дата

  5. Как да получите имена на колони на схема в sqlsoup в python?