如何将二进制数据(带有高位字节值)保存到unicode MySQL行中

时间:2018-04-11 14:24:06

标签: mysql encoding non-ascii-characters

我有一个遗留系统,它将二进制数据发送和读取到现有的MySQL表(版本5.6.34,以防万一)。我需要在新系统中将相同类型的数据写入相同类型的表中(因此旧系统的某些部分可以读取它)。但是,当我尝试编写二进制数据时,MySQL似乎会截断高字节范围内的任何内容(可能是无效的unicode)。

我无法更改表格。如何编写相同的数据。 (旧系统使用不同语言的二进制mysql驱动程序,所以我不能复制它正在做的任何事情。)

mysql> create table foobar (a_session longtext character set utf8 collate utf8_general_ci);
Query OK, 0 rows affected (0.14 sec)

mysql> insert into foobar values (_binary X'4D798053514C');
Query OK, 1 row affected, 1 warning (0.12 sec)

mysql> select * from foobar;
+-----------+
| a_session |
+-----------+
| My        |
+-----------+
1 row in set (0.13 sec)

我想要一些更新/插入命令,它将显示如下内容:

| My�SQL     |

并且具有我在命令中发送的相同二进制字节。

1 个答案:

答案 0 :(得分:0)

运行那个小测试时,也提供

SHOW VARIABLES LIKE 'char%';

80不是一个非常好的字符':

big5, binary, cp932, eucjpms, euckr, gb2312,
           gbk, sjis, ujis, utf8, utf8mb4   0  0 ''
                              ascii, swe7   1  1 '?'
armscii8, dec8, greek, hebrew, hp8, latin2,
                   latin5, latin7, tis620   2  1 ''
                                   cp1251   2  1 'Ђ'
                    cp850, cp852, keybcs2   2  1 'Ç'
                                    cp866   2  1 'А'
                          macce, macroman   2  1 'Ä'
  cp1250, cp1256, cp1257, geostd8, latin1   3  1 '€'
                             koi8r, koi8u   3  1 '─'

也就是说,latin1(以及其他一些CHARACTER SETs)将十六进制80解释为Euro;其他字符集给你的东西不那么有趣。你有什么期待?