我正在使用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
非常感谢!
答案 0 :(得分:0)
我已经尽力尝试使用SJIS,但没有成功,我通过将所有表格改为utf8mb4来解决问题。
ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;
并将编码一直改为UTF-8:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
尽可能远离SJIS。