将 UTF8 数据插入 SJIS 数据库 (MySQL)

Inserting UTF8 data into SJIS DB (MySQL)

我正在使用 web-app (JSP) 将数据从 webform 插入 mySQL 数据库,数据作为以 UTF8 编码的参数发送到 servlet。应用程序在一定程度上与普通字母和符号完美配合。但是,如果我尝试插入任何 4 字节字符,它将被问号 (?) 符号替换。

我很确定问题与 MySQL 将 UTF8 仅作为 3 个字节的奇怪方式有关,但这次排序规则是 SJIS。

我一定是忽略了一些东西,所以我将不胜感激任何可用的帮助,为此我已经苦苦挣扎了一天。

关于校对信息,我尝试了多种不同的设置,结果总是一样的,一切正常,除了4字节字符。

这是默认排序规则:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' 
OR Variable_name LIKE 'collation%';

+--------------------------+-------------------+
| Variable_name            | Value             |
+--------------------------+-------------------+
| character_set_client     | utf8              |
| character_set_connection | utf8              |
| character_set_database   | sjis              |
| character_set_filesystem | binary            |
| character_set_results    | utf8              |
| character_set_server     | latin1            |
| character_set_system     | utf8              |
| collation_connection     | utf8_general_ci   |
| collation_database       | sjis_japanese_ci  |
| collation_server         | latin1_swedish_ci |
+--------------------------+-------------------+

我也试过以下方法:

+--------------------------+------------------+
| Variable_name            | Value            |
+--------------------------+------------------+
| character_set_client     | utf8             |
| character_set_connection | utf8             |
| character_set_database   | sjis             |
| character_set_filesystem | binary           |
| character_set_results    | utf8             |
| character_set_server     | sjis             |
| character_set_system     | utf8             |
| collation_connection     | utf8_general_ci  |
| collation_database       | sjis_japanese_ci |
| collation_server         | sjis_japanese_ci |
+--------------------------+------------------+

我要插入(Z 列)的 table 示例:

show FULL COLUMNS FROM XYZ;
+--------+------------------+------------------+------+-----+---------+-----    -----------+---------------------------------+---------+
| Field  | Type             | Collation        | Null | Key | Default | Extra          | Privileges                      | Comment |
+--------+------------------+------------------+------+-----+---------+-----  -----------+---------------------------------+---------+
| X      | int(10) unsigned | NULL             | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| Y      | date             | NULL             | YES  |     | NULL    |                | select,insert,update,references |         |
| Z      | varchar(255)     | sjis_japanese_ci | YES  |     | NULL    |                | select,insert,update,references |         |
+--------+------------------+------------------+------+-----+---------+----------------+---------------------------------+---------+

里面JAVA-class编码设置如下

request.setCharacterEncoding("UTF-8");  
response.setCharacterEncoding("SHIFT_JIS");

我知道 DB 可以保存这些字符,因为以前导入的 (LODA DATA INFILE) 数据具有这些字符并且它们在 DB 中可见(不是问号)。

所以朋友们,我请求你的帮助,这可能是一件非常容易(或不可能)的事情,如果你需要更多信息,我可以从 DB/source.

获得

UTF8 4 字节字符的示例是:(您的浏览器可能不可见)


或 :) https://codepoints.net/U+1F4A9

非常感谢!

我已经尽一切努力使它与 SJIS 一起工作但没有成功,我通过将所有表更改为 utf8mb4 来解决这个问题。

ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;

并将编码一直更改为 UTF-8:

request.setCharacterEncoding("UTF-8");  
response.setCharacterEncoding("UTF-8");

尽可能远离SJIS。