日文字符被???不允许更改表/列的排序规则。如何插入这些值?
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条答案
按热度按时间qltillow1#
日本的数据已经存在了
它不可能是,或者如果是,它是乱七八糟的无法识别。首先,如果您尝试,db会抛出警告(
INSERT INTO test_table_latin1 (data) VALUES ('キーワード');
对于“data”列,使用“不正确的字符串值:'\xe3\x82\xad\xe3\x83\xbc…”。如果你强迫的话也一样(
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。我知道你可能无法做到这一点(公司政策、遗产、兼容性等等),但这并不能改变其他任何东西都不再适合我们生活的这个多元文化世界的事实。