将UTF8数据插入SJIS DB(MySQL)

时间:2015-07-19 03:03:50

标签: mysql utf-8 character-encoding collation shift-jis

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

我很确定这个问题与MySQL有点奇怪,只有UTF8只有3个字节,但这次整理是SJIS。

我必须忽略一些事情,所以我会感激任何可用的帮助,我已经为此花了一天的时间到墙上。

至于整理信息,我尝试了多种不同的设置,结果总是一样,一切正常,但4byte字符除外。

这是默认排序规则:

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列):

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类编码设置如下

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

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

所以朋友们,我问你的帮助,这可能是非常容易的(或者不可能的),如果你需要更多信息我可以从数据库/来源获得它。

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


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

非常感谢!

1 个答案:

答案 0 :(得分:0)

我已经尽力尝试使用SJIS,但没有成功,我通过将所有表格改为utf8mb4来解决问题。

ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;

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

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

尽可能远离SJIS。