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

Insert Japanese characters into latin1_swedish_ci collated mysql table column

日文字符将被替换为 ???我不允许更改 table/column 的排序规则。如何插入这些值?

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)

Japanese data is already there

不可能,如果是,也是乱码,面目全非。一方面,如果您尝试 (INSERT INTO test_table_latin1 (data) VALUES ('キーワード'); with "Incorrect string value: '\xE3\x82\xAD\xE3\x83\xBC...' for column 'data'".

,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(实际上不是),要么避免使用它们,那么您将破坏 UTF8 并且您将无法转换回来。所以这又是一个非常糟糕的情况。

最后,您可以用自己的方式来表示 "treat this part differently",例如 "Was sent [[Base64:UTF8:5qSc57Si44Kt44O844Ov44O844OJ]] - [[Base64:UTF8:6Ieq54S2]]" 并在客户端对其进行解码。

所有这些都是非常糟糕的替代方法,无法替代唯一正确的方法:将列设为 Unicode。我知道您可能无法这样做(公司政策、遗产、兼容性等),但这不会改变任何其他事物不再适合我们生活的多元文化世界的事实。