首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建模MySQL VARBINARY HEX字段?

问如何建模MySQL VARBINARY HEX字段?
EN

Stack Overflow用户
提问于 2009-10-19 08:57:49
回答 3查看 4.4K关注 0票数 3

我试图在Django v1.1.1中建模一个VARBINARY MySQL字段。二进制字段存储数据的十六进制表示(即使用INSERT INTO test(bin_val) VALUES X'4D7953514C')。

阅读Django documentation1,我想出了一个解决方案:

代码语言:javascript
复制
class MyTest(models.Model):
    bin_val = BinValField()

class BinValField(models.Field):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        """ DB -> Python """
        return ''.join('%X%X' % ((ord(byte)>>4) & 0xF, ord(byte) & 0xF) for byte in value)

    def get_db_prep_value(self, value):
        """ Python -> DB """
        return a2b_hex(value).decode('latin1')

但是,这不能正常工作,因为:

  • Django对来自MySQL的二进制数据进行Unicode转换
  • 当保存一个新的MyTest对象时,get_db_prep_value()会被调用两次(我认为这是Django中的一个bug?)

问题是你会如何模拟这样一个领域?

PS:与这个问题有关的是,这个ticket2在三年后仍然开放:(

1 Django:编写自定义模型字段

2

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-01 14:31:09

问题是Django创建数据库表的方式,也与数据库排序有关。

我解决这个问题的方法如下:

  • 将表字符集更改为utf8,将排序规则更改为utf8_bin
  • 将二进制字段从VARCHAR更改为MySQL表中的VARBINARY
  • 在to_python方法return hexlify(value)中使用
票数 1
EN

Stack Overflow用户

发布于 2009-10-19 13:51:17

您所提到的同样的票证也有一块地,它应该为实现该字段提供一些提示。

在任何情况下,将其存储在CharField中的真正问题是什么?

即使要实现bin字段,也可以扩展models.CharField并将其转换为to_python方法中的十六进制。

同样的问题也在前面得到了回答:在Django模型字段中存储二进制哈希值

票数 0
EN

Stack Overflow用户

发布于 2009-10-19 17:39:43

MySQL既不为VARBINARY字段存储十六进制表示,也不要求在INSERT语句中使用十六进制表示。与VARCHAR的唯一区别是,MySQL对其使用二进制排序规则。您可以传递任何8位字符串作为它的参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1587617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档