为什么Java字符串在MYSQL中不保存为UTF-8?

4
message = new String(("round " + id).getBytes("UTF-8"));

conn = DriverManager.getConnection("jdbc:mysql://" + host + "/" + db + "?useUnicode=true&characterEncoding=UTF-8&"
              + "user=" + login + "&password=" + password);

当我往编码为UTF-8 CI的数据库中插入数据时,会得到像这样的结果:�������������������� 179 ,而我的Java文件编码是utf-8,我哪里出了问题?

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
2个回答

1

通常,MySQL会预定义一些系统变量。如果你想列出它们,你可以打开MySQL提示符并输入:

mysql> SHOW VARIABLES LIKE  'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | latin1                     |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

如图所示,MySQL的默认编码是latin1。为了更改它,您需要编辑一下my.cnf文件并添加以下行:
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

当您配置my.cnf文件并重新启动MySQL服务器时,您会注意到差异。 编辑: 您可以像这样设置JDBC的DriverManager的编码:
DriverManager.getConnection("jdbc:mysql://" + host + "/" + db + "?useUnicode=true&"
              + "user=" + login + "&password=" + password + "&characterEncoding=utf8");

已经更改了所有内容,但仍然得到了那个糟糕的编码字符串。 - yeah its me
你重启了MySQL服务器吗? - Konstantin Yovkov
这种情况只会在我从Java代码中插入字符串时发生,如果我从phpMyAdmin中插入字符串,则一切正常。我注意到这只会发生在使用西里尔字母时,但是为什么会发生这种情况,因为编码是UTF-8呢? - yeah its me

0
除了在Java JDBC中设置连接字符串外,改变MySQL字符集的另一种方法是:
1)在创建数据库和表时指定utf8
    //database
    CREATE DATABASE IF NOT EXISTS databasename 
    default charset utf8
    COLLATE utf8_general_ci;

    //table
    CREATE TABLE  `Extenics`.`BE_headset` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

2) 或者在创建后进行更改(我不鼓励这样做)

ALTER DATABASE db_name

    [[DEFAULT] CHARACTER SET charset_name]

    [[DEFAULT] COLLATE collation_name]

查看mysql以获取更多帮助。


请尝试重启您的 MySQL 服务。 - wangdq
1
MySQLd 重启,没有任何变化。 - yeah its me
我建议以下两点:1)创建一个使用utf8的临时数据库和表,进行插入测试(使用SQL语句),观察结果。2)我的JDBC连接字符串类似于[jdbc:mysql://localhost:3306/mapping?characterSetResults=UTF-8&characterEncoding=UTF-8&useUnicode=yes],请再次检查您的URL。 - wangdq
1
数据库和表格已经完全采用UTF-8编码,我在URL中添加了characterSetResults=UTF-8,但是没有起到作用,我已经尽我所知做了一切… - yeah its me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接