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

导出/导入带有mysql点坐标的问题

  •  2
  • charlie  · 技术社区  · 6 年前

    导出时出现问题,然后将MySQL数据库从本地导入到prod:

    (我通过phpmyadmin在“简单模式”下导出和导入,带有默认选项。)


    源数据库:本地环境mysql 5.7.19(工作)

    table: lieux innodb utf8_unicode_ci

    列:

    • name=> coords
    • 类型=> point
    • value=> 'point(48.6863316 6.1703782)',0 (the good one)'

    目标数据库:生产环境mysql 5.6.?

    table: lieux innodb utf8_unicode_ci

    列:

    • name=> coords
    • 类型=> point
    • value=> 'point(-0.000000000029046067630853117-3.5831745545454659E277)',0 (the bad one)'

    导出/导入后,点值更改,所有坐标都为假。

    当我打开时,我还有一个奇怪的显示。在vscode编辑器中的sql export:。

    点值如下: (该文件采用utf-8格式)。”

    你知道UTF-8在MySQL中的坐标点是否有问题,或者Prod服务器上的旧MySQL版本是否会导致这种问题? 我应该使用utf8?mb4字符集吗?


    编辑:添加更多详细信息

    1. 在我的项目(Laravel+Google Maps JavaScript API)中,我创建(在本地环境中)一个具有这些坐标的位置: 48°41'10.8“n 6°10'13.4”e ,stored in database as point(48.6863316 6.1703782) and located here:。

    <开始=“2”>
  • 然后,我进入导出选项卡中的phpmyadmin,并进行一个简单的SQL导出(使用默认选项)。

  • 然后,我在prod服务器上登录phpmyadmin,进入导入选项卡并导入我的SQL文件(也带有默认选项)。

  • 当我查看新的数据库(在Prod服务器上)时,该值存储为 point(-0.000000000029046067630853117-3.58317455459554659E277) ,and is located here(after google maps corrected it by removing the excess characters)::

  • 我解决了这个问题,使用heidi-sql而不是phpmyadmin,它以不同的方式存储值:


    编辑:导出文件

    ——phpmyadmin sql dump
    --版本4.7.4
    --https://www.phpmyadmin.net网站/
    ——
    --高温:127.0.0.1:3306
    --李总:朱。26 JIIL。2018 03:46
    --版本:5.7.19
    --版本:7.1.9
    
    设置sql_mode=“no_auto_value_on_zero”;
    设置自动提交=0;
    开始交易;
    设置时间“区域=”+00:00“;
    
    
    /*!40101设置@old_character_set_client=@@character_set_client*/;
    /*!40101集@old_character_set_results=@@character_set_results*/;
    /*!40101设置@old_collation_connection=@@collation_connection*/;
    /*!40101设置名称utf8mb4*/;
    
    --——————————————————————————————————————————————
    
    ——
    --表结构`
    ——
    
    如果存在“lieux”,则删除表;
    如果不存在,则创建表'lieux`(
    ` id`int(10)无符号非空自动增量,
    `创建时间戳为空默认为空,
    `更新时间戳空默认空,
    […]
    ` coords`点默认为空,
    […]
    主键(`id`)
    )engine=innodb auto_increment=4默认charset=utf8 collate=utf8_unicode_ci;
    
    ——
    --表中的费用`
    ——
    
    插入到'lieux'(`id`,`created_at`,`updated_at`,[…],`coords`,[…])值中
    (1,'2018-03-23 09:13:45'、'2018-04-19 19:47:22'、[…]、'\0\0\0\0\0\0imh@d[@'、[…]),
    (2,'2018-03-23 18:11:59'、'2018-07-12 16:15:06'、[…]、'\0\0\0\0\0\0wh@.sw@'、[…]),
    (3,'2018-04-02 14:00:29'、'2018-04-19 19:47:32'、[…]、'\0\0\0\0\0\04je@mwcu@'、[…]);
    
    --——————————————————————————————————————————————
    < /代码> 
    
    

    我用[…]替换了多余的数据


    编辑:尝试phpmyadmin选项和命令行mysqldump

    我在phpmyadmin中尝试了所有相关的选项,但没有改变。 我还尝试从远程环境中导出数据库,该环境具有不同版本的phpmyadmin=>仍然不工作。

    我正在命令行中尝试从本地导出,使用以下说明:

    c:\laragon\bin\mysql\mysql-5.7.19-winx64\bin
    mysqldump.exe--host=localhost--user=root mydatabase>mydatabase.sql
    < /代码> 
    
    

    但它仍然给了我一个错误的编码:

    --mysql dump 10.13 distrib 5.7.19,for win64(x86_64)
    ——
    --主机:localhost数据库:db
    --——————————————————————————————————————————————————————————————————————————————————————————————————————————————--
    --服务器版本5.7.19
    
    /*!40101设置@old_character_set_client=@@character_set_client*/;
    /*!40101集@old_character_set_results=@@character_set_results*/;
    /*!40101设置@old_collation_connection=@@collation_connection*/;
    /*!40101设置名称utf8*/;
    /*!40103设置@old_time_zone=@@time_zone*/;
    /*!40103设置时间“区域=”+00:00'*/;
    /*!40014套@old_unique_checks=@@unique_checks,unique_checks=0*/;
    /*!40014套@old_foreign_key_checks=@@foreign_key_checks,foreign_key_checks=0*/;
    /*!40101设置@old_sql_mode=@@sql_mode,sql_mode='no_auto_value_on_zero'*/;
    /*!40111设置@old_sql_notes=@@sql_notes,sql_notes=0*/;
    
    ——
    --表的表结构'lieux`
    ——
    
    如果存在“lieux”,则删除表;
    /*!40101设置@saved_cs_client=@@character_set_client*/;
    /*!40101设置字符_set_client=utf8*/;
    创建表`LIUX`(
    ` id`int(10)无符号非空自动增量,
    `创建时间戳为空默认为空,
    `更新时间戳空默认空,
    […]
    ` coords`点默认为空,
    […]
    主键(`id`)
    )engine=innodb auto_increment=4默认charset=utf8 collate=utf8_unicode_ci;
    /*!40101设置字符_set_client=@saved_cs_client*/;
    
    ——
    --正在为表“lieux”转储数据`
    ——
    
    锁定表格'lieux'写入;
    /*!40000个alter table`lieux`禁用键*/;
    INSERT INTO `lieux` VALUES (1,'2018-03-23 09:13:45','2018-04-19 19:47:22',[...],'\0\0\0\0\0\0\0��I\�mH@�D[@',[...]),(2,'2018-03-23 18:11:59','2018-07-12 16:15:06',[...],'\0\0\0\0\0\0\0��\�WH@.\�s�w�@',[...]),(3,'2018-04-02 14:00:29','2018-04-19 19:47:32',[...],'\0\0\0\0\0\0\04j��E@�mWCu'',[…] ];
    /*!40000个alter table`lieux`启用键*/;
    解锁表;
    < /代码> 
    
    

    mysqldump命令行导出文件的一部分

    • 如何获取有关导出过程的更多信息?

    • 您认为这可能是由行上的错误值存储引起的吗? 创建(我的意思是当用户创建位置项时)?

    • 可能它链接到了This other issue(also mine,and only partly resolved)…


    • 源数据库:本地环境mysql 5.7.19(工作)

      表:lieux| innodb_utf8_unicode_ci

      专栏:

      • 名称= & gt;coords
      • 类型= & gt;point
      • 价值= & gt;'POINT(48.6863316 6.1703782)',0(好的)

      目标数据库:生产环境mysql 5.6.?

      表:列欧| innodb_utf8_unicode_ci

      专栏:

      • 名称= & gt;坐标
      • 类型= & gt;指向
      • 价值= & gt;'POINT(-0.000000000029046067630853117 -3.583174595546599e227)',0(坏的)

      导出/导入后,点值更改,所有坐标均为假。

      当我打开时,我还有一个奇怪的显示。在vscode编辑器中导出sql:

      点值如下:capture(文件采用UTF-8格式)。

      你知道UTF-8在MySQL中的坐标点是否有问题,或者Prod服务器上的旧MySQL版本是否会导致这种问题? 我应该使用utf8?mb4字符集吗?


      编辑:添加更多详细信息

      1. 在我的项目(laravel+google maps javascript api)中,我(在本地环境中)创建了一个具有以下坐标的位置:48°41'10.8"N 6°10'13.4"E,存储在数据库中为POINT(48.6863316 6.1703782)位于这里:

      original location

      1. 然后,我进入导出选项卡中的phpmyadmin,并进行一个简单的SQL导出(使用默认选项)。

      2. 然后,我在prod服务器上登录phpmyadmin,进入导入选项卡并导入我的SQL文件(也带有默认选项)。

      3. 当我查看新数据库(在prod服务器上)时,该值存储为POINT(-0.000000000029046067630853117 -3.583174595546599e227),并位于此处(在谷歌地图通过删除多余字符更正后):

      bad coordinates

      我讨论过这个问题通过使用heidi-sql而不是phpmyadmin,phpmyadmin以不同的方式存储值:

      • 在phpmyadmin export.sql文件中:capture
      • 在heidi sql export.sql文件中:binary thing

      编辑:导出文件

      -- phpMyAdmin SQL Dump
      -- version 4.7.4
      -- https://www.phpmyadmin.net/
      --
      -- Hôte : 127.0.0.1:3306
      -- Généré le :  jeu. 26 juil. 2018 à 03:46
      -- Version du serveur :  5.7.19
      -- Version de PHP :  7.1.9
      
      SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
      SET AUTOCOMMIT = 0;
      START TRANSACTION;
      SET time_zone = "+00:00";
      
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;
      
      -- --------------------------------------------------------
      
      --
      -- Structure de la table `lieux`
      --
      
      DROP TABLE IF EXISTS `lieux`;
      CREATE TABLE IF NOT EXISTS `lieux` (
        `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        `created_at` timestamp NULL DEFAULT NULL,
        `updated_at` timestamp NULL DEFAULT NULL,
        [...],
        `coords` point DEFAULT NULL,
        [...],
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
      
      --
      -- Déchargement des données de la table `lieux`
      --
      
      INSERT INTO `lieux` (`id`, `created_at`, `updated_at`, [...], `coords`, [...]) VALUES
      (1, '2018-03-23 09:13:45', '2018-04-19 19:47:22', [...], '\0\0\0\0\0\0\0��I�mH@�D[@', [...]),
      (2, '2018-03-23 18:11:59', '2018-07-12 16:15:06', [...], '\0\0\0\0\0\0\0���WH@.�s�w�@', [...]),
      (3, '2018-04-02 14:00:29', '2018-04-19 19:47:32', [...], '\0\0\0\0\0\0\04j��E@�mWCu@', [...]);
      
      -- --------------------------------------------------------
      

      我用替换多余的数据[...]


      编辑:尝试phpmyadmin选项和命令行mysqldump

      我在phpmyadmin中尝试了所有相关的选项,但没有改变。 我还尝试从远程环境中导出数据库,该环境的phpmyadmin=>版本不同,但仍无法工作。

      我正在命令行中尝试从本地导出,使用以下说明:

      C:\laragon\bin\mysql\mysql-5.7.19-winx64\bin
      λ mysqldump.exe --host=localhost --user=root mydatabase > mydatabase.sql
      

      但它仍然给了我一个糟糕的编码:

      -- MySQL dump 10.13  Distrib 5.7.19, for Win64 (x86_64)
      --
      -- Host: localhost    Database: db
      -- ------------------------------------------------------
      -- Server version   5.7.19
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8 */;
      /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
      /*!40103 SET TIME_ZONE='+00:00' */;
      /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
      /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
      /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
      /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
      
      --
      -- Table structure for table `lieux`
      --
      
      DROP TABLE IF EXISTS `lieux`;
      /*!40101 SET @saved_cs_client     = @@character_set_client */;
      /*!40101 SET character_set_client = utf8 */;
      CREATE TABLE `lieux` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `created_at` timestamp NULL DEFAULT NULL,
        `updated_at` timestamp NULL DEFAULT NULL,
        [...],
        `coords` point DEFAULT NULL,
        [...],
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
      /*!40101 SET character_set_client = @saved_cs_client */;
      
      --
      -- Dumping data for table `lieux`
      --
      
      LOCK TABLES `lieux` WRITE;
      /*!40000 ALTER TABLE `lieux` DISABLE KEYS */;
      INSERT INTO `lieux` VALUES (1,'2018-03-23 09:13:45','2018-04-19 19:47:22',[...],'\0\0\0\0\0\0\0��I\�mH@�D[@',[...]),(2,'2018-03-23 18:11:59','2018-07-12 16:15:06',[...],'\0\0\0\0\0\0\0��\�WH@.\�s�w�@',[...]),(3,'2018-04-02 14:00:29','2018-04-19 19:47:32',[...],'\0\0\0\0\0\0\04j��E@�mWCu@',[...]);
      /*!40000 ALTER TABLE `lieux` ENABLE KEYS */;
      UNLOCK TABLES;
      

      mysqldump命令行导出文件的一部分

      • 如何获取有关导出过程的更多信息?

      • 您认为这可能是由行中的错误值存储引起的吗? 创建(我的意思是当用户创建位置项时)?

      • 也许它与this other issue(也是我的,只解决了部分问题)

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rick James diyism    6 年前

    https://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html

    看起来像wkb格式:

    mysql> select HEX(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')); 
    +---------------------------------------------------------------------------------------+
    | HEX(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')) |
    +---------------------------------------------------------------------------------------+
    | 0000000001010000000E1BEFBFBDEFBFBDEFBFBD5748402EEF                                    |
    +---------------------------------------------------------------------------------------+
    

    下面是“bad”中的两个浮点数:

    mysql> select HEX(MID(REVERSE(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')), 1, 8));
    +-----------------------------------------------------------------------------------------------------------+
    | HEX(MID(REVERSE(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')), 1, 8)) |
    +-----------------------------------------------------------------------------------------------------------+
    | EF2E404857BDBFEF                                                                                          |
    +-----------------------------------------------------------------------------------------------------------+
    
    mysql> select HEX(MID(REVERSE(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')), 9, 8));
    +-----------------------------------------------------------------------------------------------------------+
    | HEX(MID(REVERSE(ST_PointFromText('POINT(-0.000000000029046067630853117 -3.583174595546599e227)')), 9, 8)) |
    +-----------------------------------------------------------------------------------------------------------+
    | BDBFEFBDBFEF1B0E                                                                                          |
    +-----------------------------------------------------------------------------------------------------------+
    

    它们似乎是合理的。

    不清楚你所说的“坏”或“错”是什么意思。请提供SQL证据。

    这个 CHARACTER SET 应该完全无关。

    啊哈。所以这些数字代表纬度和经度?好, -3.583174595546599e227 (-3.58*10^227)不是有效值。因此,从该值向后工作,并显示生成/导出/导入数字的所有步骤。我们需要发现它在哪里被弄坏了。首先查看导出文件。

    MySQL转储

    根据您最近的编辑,mysqldump正在管理 POINTs . 我不知道确切的解决方案,但是二进制的东西需要用十六进制(或者文本以外的东西)来完成。

    • phpadmin可能有一个参数??
    • 也许你可以访问mysqldump命令?

    mysqldump示例

    生成测试表:

    mysql> CREATE TABLE `lieux` (
        ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        ->   `coords` point DEFAULT NULL,
        ->   PRIMARY KEY (`id`)
        -> ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO lieux (coords) VALUES (ST_PointFromText('POINT(11.22 33.44)'));
    Query OK, 1 row affected (0.01 sec)
    
    mysql> 
    mysql> SELECT HEX(coords) FROM lieux;
    +----------------------------------------------------+
    | HEX(coords)                                        |
    +----------------------------------------------------+
    | 000000000101000000713D0AD7A3702640B81E85EB51B84040 |
    +----------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> exit 
    Bye
    

    倾倒它:

    ~$ mysqldump  --hex-blob try lieux -u root
    -- MySQL dump 10.13  Distrib 5.7.23, for Linux (x86_64)
    --
    -- Host: localhost    Database: try
    -- ------------------------------------------------------
    -- Server version   5.6.22-71.0-log
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    
    --
    -- Table structure for table `lieux`
    --
    
    DROP TABLE IF EXISTS `lieux`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `lieux` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `coords` point DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    /*!40101 SET character_set_client = @saved_cs_client */;
    
    --
    -- Dumping data for table `lieux`
    --
    
    LOCK TABLES `lieux` WRITE;
    /*!40000 ALTER TABLE `lieux` DISABLE KEYS */;
    INSERT INTO `lieux` VALUES (4,0x000000000101000000713D0AD7A3702640B81E85EB51B84040);
    /*!40000 ALTER TABLE `lieux` ENABLE KEYS */;
    UNLOCK TABLES;
    /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    -- Dump completed on 2018-08-20 13:38:24
    
        2
  •  0
  •   charlie    6 年前

    最后,将其固定在phpmyadmin 4.8.6中。

    如您所见: https://github.com/phpmyadmin/phpmyadmin/issues/14588#event-2323932464

    这个现在由 7f454ac 将成为下一版本phpmyadmin(4.8.6)的一部分