我试图在一个列中存储JSON数据(几乎是PHP中可能是未知长度的数组),这将允许我对其进行查询.我们以此为例......
假设我有一个字段询问你喜欢什么样的运动(这是一个复选框).
[] Soccer
[] Hockey
[] Football
[] Swimming
Run Code Online (Sandbox Code Playgroud)
然后将通过sports[]数组发送到PHP.然后我想把它拿到我的数据库中,看起来像
|sports|{hockey:false,swimming:true,football:false,soccer:true}|
Run Code Online (Sandbox Code Playgroud)
或类似的东西,然后我可以去
SELECT COUNT(*) FROM fields WHERE hockey = "false";
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚如何正确地做到这一点,忽略这个"例子"实际上很容易通过加入我希望使用mariadb动态列来做的事实(至少我相信这就是我想要的).我知道我可以用Postgre做到这一点.
我们正在使用以下配置的几个EC2-Classic服务器(Linux Ubuntu):已安装的EBS卷并且正在运行服务器版本:5.5.48-MariaDB
我想使用AWS DMS(AWS数据库迁移服务)并将我们的EBS DB迁移到新VPC中的RDS AuroraDB.我创建了VPC,AuroraDB(不可公开访问),AWS DMS复制实例和端点.
从EC2-classic实例中,我可以打开远程AuroraDB控制台(感谢Classic Link),它位于VPC中.目标端点(到AuroraDB)工作正常,TEST成功完成
源端点显示以下错误:
Operation:testEndpointDetails:[errType=ERROR_RESPONSE,
status=122502, errMessage=Cannot connect to ODBC provider 122502 ODBC general error.,
errDetails= RetCode: SQL_ERROR SqlState: HY000 NativeError: 2003 Message: unixODBCMySQL http://ODBC 5.3(w)
DriverCan't connect to MySQL server on 'Private.DNS.name' (110) http://122502] ODBC general error.
Run Code Online (Sandbox Code Playgroud)
我尝试设置服务器名称私有/公共DNS和私有/公共IP,仍然相同.
凭据没问题,我没有使用任何特殊字符.我在北弗吉尼亚州经营.AWS DMS复制实例设置为Public.我可以从远程EC2-classic实例登录MariaDB控制台.
我尝试将AWS DMS复制实例的端口3306和私有/公共IP设置为正确的安全组,但我想我仍然会遗漏一些东西,可能在SG区域,但我不确定.
migration amazon-ec2 amazon-web-services mariadb amazon-aurora
我使用percona-toolkit来分析mysql-slow-query(logs).所以命令非常基本:
pt-query-digest slowquery.log
现在结果(错误)是:
18.2s用户时间,100ms系统时间,35.61M rss,105.19M vsz
当前日期:2016年7月7日星期四17:18:43
主机名:Jammer
文件:slowquery.log
管道进程5(迭代)导致错误:sprintf中的冗余参数位于/ usr/bin/pt-query-digest行2556.将重试管道进程4(迭代)2次.
.. ..(相同的结果打印两次)..
管道导致错误:管道进程5(迭代)导致错误:sprintf中的冗余参数位于/ usr/bin/pt-query-digest第2556行.由于进程4(迭代)导致过多错误,因此终止管道.
现在有关环境的细节,我使用的是Ubuntu 16.04,MariaDB 10.1.14,Percona-Toolkit 2.2.16
我在这里发现了bug报告,但它就像一个解决方法,并没有真正解决错误.即使在应用补丁之后,命令结果看起来也不够令人满意.
我在ubuntu 16.04 MySql上面临同样的问题.我的慢查询日志的内容如下.
/ usr/sbin/mysqld,版本:5.7.16-0ubuntu0.16.04.1-log((Ubuntu)).开始于:Tcp端口:3306 Unix套接字:/var/run/mysqld/mysqld.sock时间Id命令参数/ usr/sbin/mysqld,版本:5.7.16-0ubuntu0.16.04.1-log((Ubuntu)).开始于:Tcp端口:3306 Unix套接字:/var/run/mysqld/mysqld.sock时间Id命令参数时间:2016-12-08T05:13:55.140764Z User @ Host:root [root] @ localhost [] Id: 20 Query_time:0.003770 Lock_time:0.000200 Rows_sent:1 Rows_examined:2 SET timestamp = 1481174035; SELECT COUNT(*)FROM INFORMATION_SCHEMA.TRIGGERS;
错误是一样的:
管道导致错误:管道进程5(迭代)导致错误:sprintf中的冗余参数位于/ usr/bin/pt-query-digest第2556行.
Ubuntu 16.04 MySql Ver 14.14 Distrib 5.7.16 pt-query-digest 2.2.16
我不太大的表挂在ALTER命令上.会是什么呢?
只有150k行,42个字段总共142 MB.InnoDB存储引擎和服务器版本:5.5.44-MariaDB MariaDB Server.1个字段'slotindex'是主键:bigint(20)和BTREE类型.
命令:
MariaDB [mydb]> ALTER TABLE `runs` CHANGE `p_w_trans_x` `p_w_tran_x` FLOAT NOT NULL;
Stage: 1 of 2 'copy to tmp table' 65.7% of stage done
Stage: 2 of 2 'Enabling keys' 0% of stage done
Run Code Online (Sandbox Code Playgroud)
在这个阶段2将永远完全挂起.
进程列表如下:
MariaDB [(none)]> show full processlist;
+--------+------+-----------------+-----------+---------+-------+---------------------------------+---------------------------------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+--------+------+-----------------+-----------+---------+-------+---------------------------------+---------------------------------------------------------------------+----------+
| 274226 | root | localhost:45423 | edc_proxy | Sleep | 16043 | …Run Code Online (Sandbox Code Playgroud) 我正试着upgrade mysql进去xamp.我正在使用laravel哪个需要mariaDB v10.2.2.所以我latest msi package从中下载了mariaDB website.现在我按照以下几点安装相同的内容:
在这之后我尝试从控制面板启动mysql并显示以下错误:
现在,在检查错误日志时,我发现了这个:
2017-02-25 12:31:56 5736 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2017-02-25 12:31:56 5736 [Note] InnoDB: Uses event mutexes
2017-02-25 12:31:56 5736 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-02-25 12:31:56 5736 [Note] InnoDB: Number of pools: 1
2017-02-25 12:31:56 5736 [Note] InnoDB: Using generic crc32 instructions
2017-02-25 12:31:56 5736 …Run Code Online (Sandbox Code Playgroud) (在那之前,我为我糟糕的英语道歉)我有这样的研究案例:
我目前在使用Web应用程序时出现问题.我为某个公司制作了一个Web应用程序.我使用CodeIgniter 3制作了应用程序.
我使用Maria DB构建了数据库.对于每个表中的id,我使用每个表的应用程序数据库的自动增量ID.我通常将Web应用程序部署到云服务器(有时公司有自己的专用服务器,但有时却没有).有一天,有一家公司,他们不想将我之前制作的应用程序部署到云端(出于安全目的,他们说).
该公司希望将该应用程序部署到员工的个人电脑上,而每个员工的电脑不相互连接(即独立的个人电脑/个人电脑/员工的笔记本电脑).他们说,他们会每5个月将员工个人电脑的所有数据收集到公司的数据中心,当然数据中心也没有连接到互联网.我告诉他们这不是存储数据的好方法.(因为当我尝试将所有数据合并为一个数据时,数据将重复,因为我的每个表的列ID都是自动增量ID,并且它是主键).不幸的是,该公司仍然希望以这种方式保留应用程序,我不知道如何解决这个问题.
他们至少有10名员工会使用这个网络应用程序.据此,我必须亲自将应用程序部署到10台PC上.
附加信息:每个员工都有自己从公司获得的唯一ID,我为每个员工创建了auto_increment id,如下表所示:
id | employee_id | employee_name |
1 | 156901010 | emp1
2 | 156901039 | emp2
3 | 156901019 | emp3
4 | 156901015 | emp4
5 | 156901009 | emp5
6 | 156901038 | emp6
Run Code Online (Sandbox Code Playgroud)
问题是每当他们从该应用程序填充表单时,某些表不存储员工的id,而是存储来自增量id的新id.
例如electronic_parts表格.它们具有如下属性:
| id | electronic_part_name | kind_of_electronic_part_id |
Run Code Online (Sandbox Code Playgroud)
如果emp1从Web应用程序填写表单,表格的内容将在下面.
| id | electronic_part_name | kind_of_electronic_part_id |
| 1 | switch | 1 …Run Code Online (Sandbox Code Playgroud) 读一个你事先不知道它的大小的LOB(没有最大分配+副本)应该是一个相当普遍的问题,但找到好的文档和/或以"正确"方式做这个的例子已经证明是非常令人抓狂的我.
我挣扎SQLBindCol但是看不出任何有效的方法. SQLDescribeCol并SQLColAttribute返回列元数据,这些元数据似乎是列大小的默认值或上限,而不是当前LOB的实际大小.最后,我决定使用以下内容:
1)将任何/所有LOB列作为SELECT语句中编号最高的列
2)SQLPrepare声明
3)SQLBindCol您想要的任何早期非LOB列
4)SQLExecute声明
5)SQLFetch结果行
6)SQLGetData在LOB列上使用大小为0的缓冲区来查询其实际大小
7)分配一个足够大的缓冲区来容纳你的LOB
8)SQLGetData这次再次在你的LOB列上使用正确大小的分配缓冲区
9)对每个后面的LOB列重复步骤6-8
10)对结果集中的更多行重复步骤5-9
11)SQLCloseCursor完成结果集后
这似乎对我有用,但似乎也很有帮助.
对SQLGetData的调用是返回服务器还是仅处理已发送到客户端的结果?
是否存在服务器和/或客户端拒绝以这种方式处理非常大的对象的问题(例如 - 超出某个大小阈值,因此它们会生成错误)?
最重要的是,有更好的方法吗?
谢谢!
除了拥有 mariadb 10.1.36-MariaDB 之外,我还收到以下错误。
EXPLAIN ANALYZE select 1
MySQL said: Documentation
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANALYZE select 1' at line 1
Run Code Online (Sandbox Code Playgroud)
我还需要在这里做什么。我的 PHP 版本是 7.2.11。
我试图让我的 docker db 容器在创建时使用数据集自动填充数据库。根据mariadb 文档,卷中有一个docker-entrypoint-initdb.d文件夹可用于此目的。
我将我的docker-compose.yml文件设置为镜像我在 StackOverflow 上找到的示例,但仍然无法执行我的 SQL 脚本。以下是我的docker-compose.yml文件的相关部分:
version: '3.6'
services:
db:
image: mariadb:10.5.4-focal
container_name: db
volumes:
- ./cms/conf/mysql/data/:/var/lib/mysql/:rw
- ./cms/sql/:/docker-entrypoint-initdb.d/:ro
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=wordpress
restart: always
adminer:
image: adminer:4.7.7-standalone
container_name: adminer
links:
- db
ports:
- 8080:8080
restart: always
Run Code Online (Sandbox Code Playgroud)
在docker-compose.yml文件旁边,我有一个cms/sql/init.sql包含以下内容的文件:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `test`;
Run Code Online (Sandbox Code Playgroud)
在每次测试迭代之前,我会清理所有旧的/缓存的 Docker 内容:
$ docker-compose …10.4$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
Run Code Online (Sandbox Code Playgroud)
此查询仅提供整个单词的搜索,并且在没有特殊字符的情况下工作正常。
foo (bar baz)
Run Code Online (Sandbox Code Playgroud)
$string = "(bar";
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
Run Code Online (Sandbox Code Playgroud)
SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'missing )
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用addcslashes和preg_quote。我成功转义(字符 withpreg_quote但过滤器不适用于该字符串,因为过滤器适用于整个单词。
任何通过整个单词更好地过滤的建议也将不胜感激。
foo(bar baz
Run Code Online (Sandbox Code Playgroud)
$filter = 'foo(bar';
$query->where('column', 'REGEXP', '[[:<:]]'.$string.'[[:>:]]');
Run Code Online (Sandbox Code Playgroud)
如果(将被转义,搜索将不起作用
mariadb ×10
mysql ×4
database ×2
php ×2
adminer ×1
amazon-ec2 ×1
codeigniter ×1
docker ×1
duplicates ×1
json ×1
laravel ×1
migration ×1
mysql-regexp ×1
mysqlupgrade ×1
odbc ×1
percona ×1
toolkit ×1
ubuntu-16.04 ×1
upgrade ×1
xampp ×1