将日语字符插入latin1_swedish_ci整理的mysql表列中

时间:2018-07-27 09:30:19

标签: mysql cjk

日语字符已被替换为???我不允许更改表/列的排序规则。如何插入这些值?

MariaDB [company]> show full columns from test_table_latin1;
+-------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type        | Collation         | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| id    | int(5)      | NULL              | YES  |     | NULL    |       | select,insert,update,references |         |
| data  | varchar(20) | latin1_swedish_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)

MariaDB [company]> insert into test_table_latin1 values (4,'Was sent 検索キーワード - 自然');
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [company]> select * from test_table_latin1 where id=4;
+------+----------------------+
| id   | data                 |
+------+----------------------+
|    4 | Was sent ??????? - ? |
+------+----------------------+
1 row in set (0.00 sec)

1 个答案:

答案 0 :(得分:2)

  

日语数据已经存在

不能,或者如果存在,则乱码无法识别。一方面,如果您尝试使用{INSERT INTO test_table_latin1 (data) VALUES ('キーワード');并为“数据”列添加“字符串值不正确:'\ xE3 \ x82 \ xAD \ xE3 \ x83 \ xBC ...”,DB会发出警告。

与强制使用(CONVERT('キーワード' USING latin1))相同,您会得到问号,因为它在无法请求的情况下会尽力而为。它试图在您意外执行操作时向您发出警告,但现在您正在明确执行该操作,它就会合规,并在问题点上标记“?”。数据丢失了,日语不再存在了,您无法执行将?????转换为キーワード的任何操作。

最好的恐怖选择是假装一切都很好:INSERT INTO test_table_latin1 (data) VALUES (CONVERT('キーワード' USING binary)),这会让您キーワード。总垃圾,但可以转换回原始垃圾的垃圾:SELECT CONVERT(CONVERT(data USING binary) USING utf8) FROM test_table_latin1;应该给您“キーワード”。问题是,这仅在没有实际瑞典语的情况下有效,因为您要么将0x7f以上的字符编码为Unicode(而不是Unicode),要么避免使用它们,则您破坏了UTF8,将无法转换回来。所以这又是一个非常糟糕的情况。

最后,您可以使用自己的方式来表示“不同地对待这一部分”,例如"Was sent [[Base64:UTF8:5qSc57Si44Kt44O844Ov44O844OJ]] - [[Base64:UTF8:6Ieq54S2]]"并在客户端上对其进行解码。

所有这些都是对单个正确替代品的不好,不好的替代品:使列成为Unicode。我了解您可能无法做到这一点(公司政策,传统,兼容性等等),但这并不能改变事实,那就是其他任何事物都不再适合我们所生活的这个多元文化世界。