utf8(阿拉伯语)字符串显示为问号(?)

utf8 (arabic) string appears as question mark (?)

我使用的是 3.8.2 版本,当插入新记录时,utf8 字符串出现一些问题,在数据库中显示为问号 (?),但它正确显示旧记录(使用 phpmyadmin 插入)。

这是我如何初始化 MySQLPool

fun init(vertx: Vertx): MySQLPool {
    val connectOptions = MySQLConnectOptions()
      .setPort(Config.mysqlPort)
      .setHost(Config.mysqlHost)
      .setDatabase(Config.mysqlDatabase)
      .setUser(Config.mysqlUsername)
      .setPassword(Config.mysqlPassword)
      .setCharset("utf8") // tried utf8mb4 also same result
      .setCollation("utf8_general_ci") // also tried utf8mb4_general_ci

    val poolOptions = PoolOptions().setMaxSize(Config.maxPoolSize)

    return MySQLPool.pool(vertx, connectOptions, poolOptions)
}

mysql 变量

character_set_client        = utf8
character_set_connection    = utf8
character_set_database      = utf8
character_set_filesystem    = binary
character_set_results       = utf8
character_set_server        = utf8mb4
character_set_system        = utf8

table整理

utf8_general_ci

mysql 创建 table

 CREATE TABLE `news` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Title` text NOT NULL,
  `Image` text NOT NULL,
  `Link` mediumtext NOT NULL,
  `Summery` mediumtext NOT NULL,
  `Story` mediumtext NOT NULL,
  `Time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6),
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 

谢谢

我想这就是你问题的答案Arabic language in php/mysql appears "????" question marks in html

您必须在第一次连接时设置字符集。

jvm 中的默认字符集似乎设置为 windows-1252 将其更改为 UTF-8 解决了

System.setProperty("file.encoding", "UTF-8")
val charset = Charset::class.java.getDeclaredField("defaultCharset")
charset.isAccessible = true
charset.set(null,null)

setCharset("utf8")setCollat​​ion("utf8_general_ci") 选项在连接级别配置,但实际上对编码的字符集没有影响,这就是为什么编码值在默认的 jvm 字符集中编码的原因