Emoji Karakteri MySQL Veritabanında nasıl saklanır


174

Projemde Emoji karakteri kullanıyorum. Bu karakterler mysql veritabanına kaydedilir (??). Veritabanında Varsayılan harmanlama kullanmıştım utf8mb4_general_ci. Gösterir

1366 Yanlış dize değeri: 1. satırdaki 'comment' sütunu için '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'


1
Verilerinizi nasıl saklıyorsunuz? Bize bu kodu gösterebilir misin?
Tomas Buteler

1
Yorumun için teşekkürler. Bu değişiklik veritabanı varsayılan koleksiyonu için ** utf8mb4 ** ve ayrıca tablo koleksiyonu ** KARAKTER SET utf8mb4 COLLATE utf8mb4_bin ** olarak çözüm bulduk. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P

1
Kod: insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'utf8mb4'ü veritabanı bağlantısında ayarlayın: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Yanıtlar:


32

1. adımda, veritabanınızın varsayılan karakter kümesini değiştirin:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2. adım, tablo oluştururken karakter kümesini ayarlayın:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

veya tabloyu değiştir

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

Bu sorguları takip ve durdu ve mysql sunucusunu yeniden başlattı, ama benim tabloya emoji eklemek çalıştığınızda hala aynı hatayı alıyorum. INSERT dışında tüm komutlar başarılı bir şekilde geçti. Girdilere GİRİN (tarih, saat, resim yazısı) DEĞERLER (2018-05-20 ', '12: 38: 00', 'Emoji ile test açıklaması: 😊❤️'); Sütun ayarları Harmanlama'dır: utf8mb4_0900_ai_ci Tanım: açıklama metni

1
Bağlantınızın çalışması için utf8mb4 değil de utf8 olması gerekir.
Henrik Hansen

3
@ospider, 2. adımda unicode yerine utfmb4_general_ci kullanıyorsunuz - bunun bir nedeni var mı?
Warren

265

1) Veritabanı: Veritabanı varsayılan harmanlamasını değiştirin utf8mb4.

2) Tablo: Tablo harmanlamasını şu şekilde değiştirin CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Sorgu:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Kod:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) utf8mb4Veritabanı bağlantısında ayarlayın :

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

4
Veritabanı varsayılan koleksiyonunu değiştirmeden mümkün müdür?
AliN11

23
Bu benim için çalışmıyor. Alıyorum "???" ifadeler yerine. sadece "☺" bu güvenli bir şekilde veritabanına yaptı.
Meraklı Geliştirici

10
Tabloyu sadece utf8mb4 olarak güncellemeniz gerekebilir, aynı zamanda sütunların kendileri de, aksi halde yine de görünebilirler ?? 💙 yerine.
Ael

2
Benim için çalıştı, ancak MySQL'i yeniden başlatmayı unutmayın.
Ravi Misra

8
SET NAMES utf8mb4;İfadeleri kaydetmeye başlamak için çalıştırmam gerekiyor ; bu komuttan önce onları ??
kaydediyordu

18

Hem veritabanlarının hem de tabloların karakter kümesi utf8mb4ve harmanlaması olmalıdır utf8mb4_unicode_ci.

Yeni bir veritabanı oluştururken şunları kullanmalısınız:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Bir varsa varolan veritabanını ve desteği eklemek istiyorum:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Ayrıca tablolarınız için doğru karakter kümesini ve harmanlamayı ayarlamanız gerekir:

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

veya çok fazla veri içeren tablolarınız varsa değiştirin :

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Not utf8_general_ciartık iyi uygulama önerilir. İlgili Soru ve Cevaplara bakın:

Stack Overflow'daki utf8_general_ci ve utf8_unicode_ci arasındaki fark nedir ?


veri içeren bir veritabanı ve tablo var. ve ikinci alter deyimi yürütürken diyor ki: ERROR 1833 (HY000): 'id' sütun değiştirilemiyor: 'FK12njtf8e0jmyb45lqfpt6ad89' tablonun 'lizbazi.post' yabancı anahtar kısıtlamada kullanılan
Seyyed Mahdiyar Zerehpoush

@SeyyedMahdiyarZerehpoush - güncellemenizi burada açıklandığı gibi, onu gerektiren belirli sütunlarla sınırlandırabilirsiniz: stackoverflow.com/a/15781925/1247581 ör.ALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain 17:09

sütunlar için utf8mb4_binvs kullanırken herhangi bir fark utf8mb4_unicode_ci?
Muhammed Ömer Aslam

14

Solr + Mysql + Java kullanıyorsanız şunları kullanabilirsiniz:

Bu kullanılabilir:

  • case1: DB'yi değiştirmek istemediğinizde.
  • case2: İfadelerinizi Mysql'inizden Solr çekirdeğine almanız gerektiğinde.

Yukarıdaki durumda bu, ifadelerinizi sisteminizde saklamak için çözümlerden biridir.

Kullanmak için adımlar:

Kullanılan kütüphane: import java.net.URLDecoder; ithalat java.net.URLEncoder;

  1. İfadeleri olan Dizenizi kodlamak için urlEncoder kullanın.
  2. MysqlDB'yi değiştirmeden DB'de saklayın.
  3. İsterseniz solr çekirdeğinde (kod çözülmüş form) saklayabilir veya kodlanmış formu saklayabilirsiniz.
  4. Bu ifadeleri DB veya Solr çekirdeğinden alırken artık urlDecoder kullanarak kodunu çözebilirsiniz.

Kod örneği:

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

1
bir cazibe gibi çalışmak, ben modelde kullandım, bu yüzden gerçekten kod ve veritabanı sadece setter ve içeriğin alıcısı üzerinde veri modelini değiştirmek gerekmez
bowpunya

1
Kodlama / kod çözme işlevi çağrıları soruna neden olma eğilimindedir. Bunun yerine, çeşitli yerlerde karakter seti ayarlarını düzeltin.
Rick James

1
Bu sorunu çözmüyor, atlıyor. Ve bu yöntemle ilgili bir dizi sorunla karşılaşacaksınız, örneğin her şeyi kodlamanız ve kodlamanız gerektiğinden uygulamanızı yavaşlatacaksınız. Ayrıca karakteri girerseniz %, kod çözmeniz bozulur.
Jonathan Laliberte

14

Yükseltme için benim veritabanı ve tablo güncelledik utf8 için utf8mb4 . Ama benim için hiçbir şey işe yaramıyor. Sonra sütun veri tipini blob için güncellemeye çalıştım , neyse ki benim için çalıştı ve veriler kaydedildi. Veritabanım ve tablom bile CHARACTER SET utf8 COLLATE utf8_unicode


13

Sütunu değiştirme komutu:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

Ve type = kullanmalıyız BLOB

Değiştirilecek örnek aşağıdaki gibidir: -

ALTER TABLE messages MODIFY content BLOB;

En son mySQL ve diğer veritabanlarının ''table_name, column_name vb. Komutlarda kullanılmasına gerek olmadığını kontrol ettim .

Verileri Getir ve Kaydet: Sohbet içeriğini doğrudan sütuna kaydedin ve veri alın, verileri (byte[])db sütunundan bayt dizisi olarak getirin ve ardından string(Java kodu)

new String((byte[]) arr) 

2
Evet. Sadece belirli bir alanda emoji gibi unicode saklamanız gerekiyorsa, kabul edilen cevap çok müdahaleci, text/ varcharalanını a olarak değiştirin blobve işiniz bitti. Sadece bunun için tüm DB charset ve harmanlama dönüştürmek için delilik :)
davidkonrad

9

Cevabım sadece Selvamani P cevabına eklendi.

İle herhangi bir SET NAMES utf8sorguyu da değiştirmeniz gerekebilir SET NAMES utf8mb4. Bu benim için hile yaptı.

Ayrıca, bu web sitenizi utf8'den utf8mb4'e taşımak için harika bir makaledir. Özellikle makale, dizinleri ve onarım tablolarını utf8mb4'e dönüştürdükten sonra 2 iyi noktaya işaret ediyor:

ENDEKSLERİ

Utf8'den utf8mb4'e dönüştürürken, bir sütun veya dizin anahtarının maksimum uzunluğu bayt cinsinden değişmez. Bu nedenle, karakter açısından daha küçüktür, çünkü bir karakterin maksimum uzunluğu şimdi üç yerine dört bayttır. [...] InnoDB depolama motoru maksimum 767 bayt dizin uzunluğuna sahiptir, bu nedenle utf8 veya utf8mb4 sütunları için sırasıyla en fazla 255 veya 191 karakter dizine ekleyebilirsiniz. Şu anda dizinleri 191 karakterden uzun olan utf8 sütunlarınız varsa, utf8mb4 kullanırken daha az sayıda karakteri dizine eklemeniz gerekir.

ONARIM TABLOLARI

MySQL sunucusunu yükselttikten ve yukarıda açıklanan gerekli değişiklikleri yaptıktan sonra, tüm veritabanlarını ve tabloları onarmayı ve optimize etmeyi unutmayın. Yükseltmeden sonra hemen yapmadım (her şeyin ilk bakışta iyi göründüğü için gerekli olduğunu düşünmedim) ve UPDATE ifadelerinin herhangi bir etkisi olmadığı bazı garip hatalara rastladım. hatalar atıldı.

Makalede tabloları onarmak için sorgular hakkında daha fazla bilgi edinin.


REPAIR TABLEve OPTIMIZE TABLEgereksiz olmalı - ALTERbunları yapma etkisi vardır.
Rick James

5

Asıl mesele yukarıdaki cevaplarda belirtilmemiş,

Sorgu dizesini seçeneklerle geçirmemiz "useUnicode=yes"ve"characterEncoding=UTF-8" bağlantı dizesinde geçirmeliyiz

Böyle bir şey

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

5

Eh, Tüm DB Karakter Kümesini değiştirmeniz gerekmez. Bunun yerine blob sütununu değiştirerek yapabilirsiniz türüne .

ALTER TABLE mesajları İçeriği DEĞİŞTİR BLOB;


3

Zaman kazanmak için iyi bir çözümüm var. Ben de aynı problemle karşılaştım ama ilk cevapta bu problemi çözemedim.

Defualt karakteriniz utf-8. Ancak emojinin onu desteklemek için utf8mb4'e ihtiyacı var. Mysql yapılandırma dosyasını gözden geçirme izniniz varsa, bu adımı izleyebilirsiniz.

Bu nedenle, karakter kümenizi yükseltmek için aşağıdaki adımı uygulayın (utf-8'den utf8mb4'e).

adım 1. mysql için my.cnf'nizi açın, aşağıdaki satırları my.cnf'nize ekleyin.

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

Adım 2. mysql hizmetinizi durdurun ve mysql hizmetini başlatın

mysql.server stop
mysql.server start

Tamamlandı! Sonra karakterinizin utf8mb4 olarak değiştirildiğini kontrol edebilirsiniz.

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

2

Teknoloji yığını olan uygulama için Emoji desteği - mysql, java, springboot, hazırda bekletme

Unicode desteği için aşağıdaki mysql değişikliklerini uygulayın.

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

DB Bağlantısı - jdbc url değişikliği:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

Not - Yukarıdaki adım işe yaramazsa, lütfen mysql-connector sürümünü 8.0.15 olarak güncelleyin. (mysql 5.7, unicode desteği için 8.0.15 bağlayıcı sürümüyle çalışır)


1

Benim için en basit çözüm, verileri json_encode olarak saklamaktır .

daha sonra aldığınızda sadece json_decode emin olun .

Burada veritabanının ve tablonun harmanlamasını veya karakter kümesini değiştirmeniz gerekmez.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.