Mysql varbinary类型行和无效字符

时间:2011-12-24 08:23:16

标签: mysql character-encoding varbinary

不幸的是我已经截断了我的表格,当我想导入备份时,我遇到了VARBINARY(24)类型行的一些问题。

有什么问题?

我希望我的领域如下:ŔÎĹͳ׼ųÎ070905-121713

但是当我使用以下查询时:

UPDATE `proto` 
SET `vname` = 'ŔÎĹͳ׼ųÎ070905-121713 ' 
WHERE `id` = 127;

查询正在执行而没有任何错误,但我做了:

SELECT `vname` 
FROM `proto` 
WHERE `id` = 127;

我看到我的vname字段包含以下数据:

c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039

而不是

ŔÎĹͳ׼ųÎ070905-121713

这有什么问题以及为什么我无法将我的字段数据设置为:ŔÎĹͳ׼ųÎ070905-121713

2 个答案:

答案 0 :(得分:2)

您的字符串是一个unicode字符串。它以utf-8编码编码,可以为一个字符使用多个字节。因此,您的字符串对应于以下字节序列:

c5 94 c3 8e c4 b9 c3 8d c5 82 c3 97 c4 bd c4 b9 c5 82 c3 8e 30 37 30 39 30 35 2d 31 32 31 37 31 33

您的列声明为VARBINARY(24),因此您的数据不适合列并被截断。只存储24个字节:

c5 94 c3 8e c4 b9 c3 8d c5 82 c3 97 c4 bd c4 b9 c5 82 c3 8e 30 37 30 39

这就是你所看到的。

要解决此问题,请将列的类型设置为VARCHAR(24),以便将限制应用于字符数,而不是字节。将表格的编码设置为“utf-8”。如果你可以设置连接编码,让它也是“utf-8”(看起来它已经是“utf-8”)。一切都会好的。

如果您不想创建列VARCHAR,则可以将VARBINARY的容量加倍。让它为VARBINARY(48)。但我不推荐这个。虽然大多数24-char utf-8编码的字符串将适合48个字节,但其中一些不会(因为一些外来字符可能占用超过2个字节。理论上,utf-8中一个字符的长度可以达到6个字节!尽管很少......)。如果你使列VARCHAR这将是最好的选择,因为事实上你把文本放在那里,而不是二进制数据。

答案 1 :(得分:1)

将二进制数据作为字符序列传递时,编码问题可能会增加。当您发送“ŔÎĹͳ׼ųÎ070905-121713”时,服务器必须弄清楚您的意思是什么二进制数据,这取决于为您的连接选择的编码。试着检查一下是否正确。

一般情况下,我更喜欢将二进制数据传递为十六进制(如x'123AB45CD789EF0123'),但据我了解,您已经有一个表备份,其中数据表示为字符,因此这不是一个选项你。