Cara menyimpan Karakter Emoji di Database MySQL


172

Saya menggunakan karakter Emoji di proyek saya. Karakter-karakter itu disimpan (??) ke dalam database mysql. Saya telah menggunakan database Default collation di utf8mb4_general_ci. Itu menunjukkan

1366 Nilai string salah: '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...' untuk kolom 'komentar' di baris 1


1
Bagaimana Anda menyimpan data Anda? Bisakah Anda menunjukkan kode itu kepada kami?
Tomas Buteler

1
Terima kasih atas komentar Anda. Saya telah menemukan solusi untuk koleksi default Change Database ini sebagai ** utf8mb4 ** dan juga Change Table collection sebagai ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P

1
Kode: 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'Atur utf8mb4 dalam koneksi basis data: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Jawaban:


30

langkah 1, ubah charset default database Anda:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

langkah 2, atur charset saat membuat tabel:

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

atau ubah tabel

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

Saya mengikuti pertanyaan ini dan berhenti dan me-restart server mysql, tetapi ketika saya mencoba untuk memasukkan emoji ke meja saya, saya masih mendapatkan kesalahan yang sama. Semua perintah berhasil dilakukan kecuali INSERT. INSERT INTO Entries (tanggal, waktu, caption) VALUES (2018-05-20 ', '12: 38: 00', 'Deskripsi pengujian dengan emoji: 😊❀️'); Pengaturan kolom adalah Collation: utf8mb4_0900_ai_ci Definisi: teks deskripsi

1
Koneksi Anda juga harus utf8mb4 bukan utf8 agar dapat berfungsi.
Henrik Hansen

3
@ospider, pada langkah 2 Anda menggunakan utfmb4_general_ci alih-alih unicode - ada alasan mengapa?
Warren

264

1) Basis Data: Ubah susunan default Basis Data sebagai utf8mb4 .

2) Tabel: Ubah susunan tabel sebagai CHARACTER SET utf8mb4 COLLATE utf8mb4_bin .

Pertanyaan:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Kode:

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) Ditetapkan utf8mb4dalam koneksi basis data:

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

4
Apakah mungkin tanpa mengubah koleksi default database?
AliN11

23
Ini tidak bekerja untuk saya. Saya mendapatkan "???" bukannya smilies. hanya "☺" ini yang berhasil mencapai basis data dengan aman.
Pengembang Penasaran

10
Mungkin perlu memperbarui tidak hanya tabel ke utf8mb4, tetapi juga kolom itu sendiri, kalau tidak mereka masih dapat muncul sebagai ?? bukannya πŸ’™.
Ael

2
Bekerja untuk saya, tetapi jangan lupa untuk me-restart MySQL.
Ravi Misra

8
Saya perlu berlari SET NAMES utf8mb4;untuk mulai menyimpan emotikon; sebelum perintah itu disimpan sebagai??
cubbuk

18

Basis data dan tabel harus memiliki kumpulan karakter utf8mb4dan susunanutf8mb4_unicode_ci .

Saat membuat database baru Anda harus menggunakan:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Jika Anda memiliki database yang sudah ada dan Anda ingin menambahkan dukungan:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Anda juga perlu mengatur set karakter dan susunan yang benar untuk tabel Anda:

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

atau ubah jika Anda memiliki tabel yang ada dengan banyak data:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Perhatikan bahwa utf8_general_cipraktik terbaik tidak lagi direkomendasikan. Lihat tanya jawab terkait:

Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci pada Stack Overflow.


saya punya database dan tabel yang berisi data.and ketika menjalankan pernyataan perubahan kedua, mengatakan bahwa: KESALAHAN 1833 (HY000): Tidak dapat mengubah kolom 'id': digunakan dalam batasan kunci asing 'FK12njtf8e0jmyb45lqfpt6ad89' dari tabel 'lizbazi.post'
Seyyed Mahdiyar Zerehpoush

@SeyyedMahdiyarZerehpoush - Anda mungkin dapat pergi dengan membatasi pembaruan Anda ke kolom tertentu yang memerlukannya, seperti dijelaskan di sini: stackoverflow.com/a/15781925/1247581 misalnyaALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

ada perbedaan saat menggunakan utf8mb4_binvs utf8mb4_unicode_ciuntuk kolom?
Muhammad Omer Aslam

14

Jika Anda menggunakan Solr + Mysql + Java, Anda dapat menggunakan:

Ini bisa digunakan:

  • case1: Ketika Anda tidak ingin mengubah DB.
  • case2: ketika Anda harus mengimpor emotikon dari Mysql ke Solr core Anda.

Dalam kasus di atas, ini adalah salah satu solusi untuk menyimpan emotikon di sistem Anda.

Langkah-langkah untuk menggunakannya:

Pustaka yang digunakan: import java.net.URLDecoder; import java.net.URLEncoder;

  1. Gunakan urlEncoder untuk menyandikan String Anda yang memiliki emotikon.
  2. Simpan di DB tanpa mengubah MysqlDB.
  3. Anda dapat menyimpannya dalam solr core (bentuk yang didekodekan) jika diinginkan atau Anda dapat menyimpan formulir yang disandikan.
  4. Saat mengambil emotikon ini dari DB atau Solr core Anda sekarang dapat mendekodekannya Menggunakan urlDecoder.

Contoh kode:

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;
}

Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Toby Speight

1
bekerja seperti pesona, saya menggunakannya dalam model, jadi saya benar-benar tidak perlu mengubah kode dan basis data hanya model data pada setter dan pengambil konten
bowpunya

1
Panggilan fungsi encode / decode cenderung menyebabkan masalah. Alih-alih memperbaiki pengaturan charset di berbagai tempat.
Rick James

1
Ini bukan memecahkan masalah, ini melewatinya. Dan Anda akan mengalami sejumlah masalah dengan metode ini, misalnya Anda akan memperlambat aplikasi Anda karena Anda harus memecahkan kode dan menyandikan semuanya. Juga jika Anda memasukkan karakter %, decoding Anda akan rusak.
Jonathan Laliberte

14

Saya telah memperbarui database dan tabel saya untuk ditingkatkan dari utf8 ke utf8mb4 . Tapi tidak ada yang berhasil untuk saya. Kemudian saya mencoba memperbarui datatype kolom menjadi gumpalan , untungnya itu berhasil bagi saya dan data telah disimpan. Bahkan database dan tabel saya keduanya adalah CHARACTER SET utf8 COLLATE utf8_unicode


13

Perintah untuk memodifikasi kolom adalah:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

Dan kita perlu menggunakan type = BLOB

Contoh untuk memodifikasi adalah di bawah: -

ALTER TABLE messages MODIFY content BLOB;

Saya memeriksa bahwa mySQL terbaru dan database lain tidak perlu ''digunakan dalam perintah pada table_name, column_name dll.

Mengambil dan Menyimpan data: Langsung menyimpan konten obrolan ke kolom dan untuk mengambil data, ambil data sebagai array byte (byte[])dari kolom db dan kemudian mengubahnya menjadi stringmisalnya (kode Java)

new String((byte[]) arr) 

2
Iya. Jika Anda hanya perlu menyimpan unicode seperti emoji di bidang tertentu, jawaban yang diterima terlalu mengganggu, Cukup ganti bidang text/ varcharke blobdan Anda selesai. Kegilaan untuk mengubah charset dan collation pada seluruh DB hanya untuk itu :)
davidkonrad

9

Jawaban saya hanya menambah jawaban Selvamani P.

Anda mungkin juga perlu mengubah SET NAMES utf8kueri apa punSET NAMES utf8mb4 . Itu berhasil bagi saya.

Juga, ini adalah artikel yang bagus untuk port situs web Anda dari utf8 ke utf8mb4. Secara khusus artikel ini membuat 2 poin bagus pada indeks dan memperbaiki tabel setelah mengubahnya menjadi utf8mb4:

INDEKS

Ketika mengkonversi dari utf8 ke utf8mb4, panjang maksimum kolom atau kunci indeks tidak berubah dalam hal byte. Oleh karena itu, lebih kecil dalam hal karakter, karena panjang maksimum karakter sekarang empat byte, bukan tiga. [...] Mesin penyimpanan InnoDB memiliki panjang indeks maksimum 767 byte, jadi untuk kolom utf8 atau utf8mb4, Anda dapat mengindeks masing-masing maksimal 255 atau 191 karakter. Jika saat ini Anda memiliki utf8 kolom dengan indeks yang lebih panjang dari 191 karakter, Anda perlu mengindeks jumlah karakter yang lebih kecil saat menggunakan utf8mb4.

PERBAIKAN TABEL

Setelah memutakhirkan server MySQL dan membuat perubahan yang diperlukan dijelaskan di atas, pastikan untuk memperbaiki dan mengoptimalkan semua database dan tabel. Saya tidak segera melakukan ini setelah memutakhirkan (saya tidak berpikir itu perlu, karena semuanya tampak berfungsi dengan baik pada pandangan pertama), dan bertemu dengan beberapa bug aneh di mana pernyataan UPDATE tidak memiliki efek apa pun, meskipun tidak ada kesalahan dilemparkan.

Baca selengkapnya tentang kueri untuk memperbaiki tabel pada artikel.


REPAIR TABLEdan OPTIMIZE TABLEtidak perlu - ALTERmemiliki efek melakukannya.
Rick James

5

Poin utama belum disebutkan dalam jawaban di atas bahwa,

Kita perlu meneruskan string kueri dengan opsi "useUnicode=yes"dan "characterEncoding=UTF-8"dalam string koneksi

Sesuatu seperti ini

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

5

Nah, Anda tidak perlu mengubah Charset Whole DB. Alih-alih itu Anda bisa melakukannya dengan mengubah kolom ke tipe blob .

ALTER TABEL pesan MODIFIKASI konten BLOB;


3

Saya punya solusi yang baik untuk menghemat waktu Anda. Saya juga menemui masalah yang sama tetapi saya tidak bisa menyelesaikan masalah ini dengan jawaban pertama.

Karakter defualt Anda adalah utf-8. Tetapi emoji membutuhkan utf8mb4 untuk mendukungnya. Jika Anda memiliki izin untuk merevisi file konfigurasi mysql, Anda dapat mengikuti langkah ini.

Oleh karena itu, lakukan langkah berikut untuk memutakhirkan rangkaian karakter Anda (dari utf-8 ke utf8mb4).

langkah 1. buka my.cnf Anda untuk mysql, tambahkan baris berikut ini ke my.cnf Anda.

[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

Langkah 2. hentikan layanan mysql Anda, dan mulai layanan mysql

mysql.server stop
mysql.server start

Jadi! Kemudian Anda dapat memeriksa karakter Anda diubah menjadi utf8mb4.

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

Dukungan Emoji untuk aplikasi yang memiliki tumpukan teknologi - mysql, java, springboot, hibernate

Terapkan perubahan di bawah ini di mysql untuk dukungan unicode.

  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;

Koneksi DB - perubahan jdbc url:

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

Catatan - Jika langkah di atas tidak berhasil, perbarui versi konektor mysql ke 8.0.15. (mysql 5.7 berfungsi dengan konektor versi 8.0.15 untuk dukungan unicode)


1

Solusi paling sederhana yang berfungsi untuk saya adalah menyimpan data sebagai json_encode .

nanti saat Anda mengambil pastikan saja Anda json_decode itu.

Di sini Anda tidak perlu mengubah susunan atau rangkaian karakter dari database dan tabel.


0

Bagi siapa pun yang mencoba untuk memecahkan ini pada contoh MySQL berhasil (dalam kasus saya di AWS RDS), cara termudah adalah untuk memodifikasi kelompok parameter dan mengatur set karakter server dan pemeriksaan untuk menjadi utf8mb4dan utf8mb4_binmasing-masing. Setelah me-reboot server, permintaan cepat memverifikasi pengaturan untuk database sistem dan yang baru dibuat:

SELECT * FROM information_schema.SCHEMATA S;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.