這件事是這樣的,小蛙需要接收一個從 App 過來的表單資料,就在接收後要塞進 MariaDB 的時候,問題就出現了 …

// 小蛙的訊息不知道跑哪去了,這個訊息從 參考資料1 中 copy 出來的
Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1

一再檢查要塞入的字串感覺沒有什麼問題,試了好幾次之後才發現 … 原來裡面包含了 emoji 啦!!!

之前跟同事聊天的時候得知,如果要存 emoji 的話要把資料庫的欄位改成 utf8mb4,但是呢 … 小蛙實在不想動太多,參考資料裡有很多解法,有興趣可以去看看。

小蛙這邊只是把要存 emoji 的欄位改成 utf8mb4,然後 … php 一執行,還是噴一樣的錯誤出來,嗯 ~ 這個案情不單純,來慢慢 try ~

// 單純想把 utf-8 改成 utf8mb4,當然一定是不可行
jdbc:mysql://ip:port/db_name?useUnicode=true&characterEncoding=utf8mb4

試了一些方法之後發現,在 php 的部份連線後,在做任何操作之前先執行

mysqli_query( $conn, "SET NAMES 'utf8mb4'");

ㄟ ~ 竟然好像貌似就可以了!另一個專案需要用 Java 去剖析並塞入有 emoji 的需求,立馬試試

ps.executeQuery("SET NAMES 'utf8mb4'");

哦哦哦哦哦哦哦哦哦哦哦哦哦 ~

有很多文章的教學是根本的解決方法,像是把資料庫各項設定都直接改成 utf8mb4,小蛙不想動到太多,試出這方法,最後總結一下:

  1. mysql connector 更新到新版
  2. jdbc:mysql://ip:port/db_name?useUnicode=true&characterEncoding=utf-8&character_set_server=utf8mb4
  3. 建立 Statement 或 PreparedStatement 後就立馬執行 SET NAMES ‘utf8mb4’

以上,希望幫助到有需要的人!

參考資料
  1. utf8mb4 in MySQL Workbench and JDBC – Stack Overflow
  2. Caused by: java.sql.SQLException: Unsupported character encoding ‘utf8mb4’ – Stack Overflow
  3. JDBC and utf8mb4 encoding the emoji symbol 🔥 – Stack Overflow
  4. mysql/Java服务端对emoji(utf8mb4编码)的支持有关的问题 – CSDN 博客

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *