SQLyog Copy Table with geometry field failed with Cannot get geometry object from data you send to the GEOMETRY 字段

SQLyog Copy Table with geometry field failing with Cannot get geometry object from data you send to the GEOMETRY field

我正在尝试使用 SQLyog IDE 在 mySql 中执行复制 Table(s) To Different Host/Database,并且遇到以下错误复制具有 2 个几何字段的 table:

Cannot get geometry object from data you send to the GEOMETRY field

关于此错误还有其他几个 SO 问题,但大多数时候最终的答案是,这可能是由于尝试插入空字符串而发生的(this 文章声称几何字段接受 NULL 值).

就我而言,似乎与 NULL 或空字符串无关。

我能够找到因该错误而失败的第一个插入语句。这是它的样子:

(
    45,
    '2016-01-26 11:44:13',
    'a',
    '',
    0,
    0,
    3,
    100,
    1,
    1,
    -- 1st geometry field
    '[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]',
    -- 2nd geometry field
    '[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]”¯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,
    '[=12=][=12=][=12=][=12=][=12=][=12=][=12=]kÛÚeA@Lˆv¡@@',
    '[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]¬Q^ÓdA@Ž„ì$Ø\n@@¬Q^ÓdA@Œ[=12=]c@@)eW^eA@Œ[=12=]c@@)eW^eA@Ž„ì$Ø\n@@¬Q^ÓdA@Ž„ì$Ø\n@@',
    'test move',
    - 1,
    - 1,
    2913,
    - 1
)

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

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

我的眼睛在工作插入和非工作插入之间看到的唯一区别是后者在我不知道什么字符集中包含数据,而工作插入不是(他们的数据似乎在几何数据类型术语中设置为 null/default 值)。

不工作的插入件有什么问题,您可以通过查看它们来判断吗?

P.S.: 一位团队成员声称他通过更改 MySQL 服务器的 my.ini 文件解决了这个问题 - 通过将设置 max_allowed_packet 从 4M(默认)更改为到 100M。

# 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

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

以下内容对从 SQLYog IDE 执行 Copy Table(s) To Different Host/Database 没有帮助,但显示了正确的 INSERT 语句的样子。

所以,回顾一下:

问题:如何在 mySql 中插入具有 spatial/geometry 字段的记录?

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

这是一个例子:

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

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

所以现在通过 SQL 或一个简单的应用程序将带有空间字段的 table 转储到另一个是一件简单的事情(我所做的)。