不幸的是我已经截断了我的表格,当我想导入备份时,我遇到了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
?
答案 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'),但据我了解,您已经有一个表备份,其中数据表示为字符,因此这不是一个选项你。