代码之家  ›  专栏  ›  技术社区  ›  Veverke

SQLyog复制具有几何字段的表失败,因为无法从发送到几何字段的数据中获取几何对象

  •  3
  • Veverke  · 技术社区  · 8 年前

    我试图使用SQLyog IDE将表复制到mySql中的不同主机/数据库,在复制具有2个几何字段的表时遇到以下错误:

    无法从发送到“几何体”字段的数据中获取几何体对象

    关于这个错误还有其他几个SO问题,但大多数情况下,结论性的答案是,这可能是由于试图插入空字符串造成的( this

    在我的例子中,似乎与NULL或空字符串没有任何关系。

    我找到了第一个insert语句,该语句因该错误而失败。下面是它的样子:

    (
        45,
        '2016-01-26 11:44:13',
        'a',
        '',
        0,
        0,
        3,
        100,
        1,
        1,
        -- 1st geometry field
        '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
        -- 2nd geometry field
        '\0\0\0\0\0\0\0\0\0\0\0\0\0”¯oM¿”¯oM¿”¯oM¿”¯oM?”¯oM?”¯oM?”¯oM?”¯oM¿”¯oM¿”¯oM¿',
        'Geodata',
        - 1,
        - 1,
        1,
        - 1
    )
    

    另一个失败插入的示例:

    (
        13853,
        '2016-01-26 11:44:13',
        'test move',
        '',
        3,
        0,
        1251,
        0,
        1,
        0,
        '\0\0\0\0\0\0\0kÛÚeA@Lˆv¡@@',
        '\0\0\0\0\0\0\0\0\0\0\0\0\0¬Q^ÓdA@Ž„ì$Ø\n@@¬Q^ÓdA@Œ\0c@@)eW^eA@Œ\0c@@)eW^eA@Ž„ì$Ø\n@@¬Q^ÓdA@Ž„ì$Ø\n@@',
        'test move',
        - 1,
        - 1,
        2913,
        - 1
    )
    

    如果我将这些插入与复制表中执行时没有错误的先前插入进行比较(我在目标表中看到它们),则前2个是这样的:

        (
            31,
            '2016-01-26 11:44:13',
            'Route 1',
            '',
            2,
            0,
            3,
            0,
            1,
            1,
            '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
            '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
            'Geodata',
            - 1,
            - 1,
            1,
            - 1
        ),
        (
            32,
            '2016-01-26 11:44:13',
            'Route 2',
            '',
            2,
            0,
            3,
            0,
            1,
            1,
            '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
            '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
            'Geodata',
            - 1,
            - 1,
            1,
            - 1
        )
    

    我的眼睛所能看到的工作插入和非工作插入之间的唯一区别是,后者包含I-do-not-know-what字符集中的数据,而工作插入不包含(在几何数据类型术语中,它们的数据似乎设置为空/默认值)。

    不工作的插入件有什么问题吗?只要看一下就知道了?

    P、 一个团队成员声称他通过改变MySQL服务器的my来解决这个问题。ini文件-通过更改设置 max_allowed_packet 从4米(默认值)到100米。

    # The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
    # mysql_stmt_send_long_data() C API function.
    max_allowed_packet=100M
    

    我重新启动了我的机器,但这没有帮助,继续出现同样的错误。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Veverke    7 年前

    以下内容无助于执行 Copy Table(s) To Different Host/Database 来自SQLYog IDE,但显示了正确的INSERT语句的外观。

    问题

    解决方案 :如果您查询一个表,以便将其记录复制到另一个表中,您需要首先确保以正确的格式读取它们,mySql函数可以使用这种格式 GeomFromText ,用于从其文本表示形式中创建空间/几何体值。为了读取这种文本表示中的空间值,需要使用函数 AsText .

    下面是一个例子:

    enter image description here

    然后,insert语句值只需要将这些空间对象文本表示形式包装在函数调用中 ,如(对于多边形)

    GEOMFROMTEXT('POLYGON((-84.4920600543037 10.4982373909963,-84.4920600543037 10.4984201128037,-84.4918773324963 10.4984201128037,-84.4918773324963 10.4982373909963,-84.4920600543037 10.4982373909963))')

    因此,现在将一个带有空间字段的表转储到另一个表中是一件简单的事情,可以通过SQL或一个简单的应用程序来实现(我就是这么做的)。