日语字符已被替换为???我不允许更改表/列的排序规则。如何插入这些值?
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)
答案 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。我了解您可能无法做到这一点(公司政策,传统,兼容性等等),但这并不能改变事实,那就是其他任何事物都不再适合我们所生活的这个多元文化世界。