我创建了一个数据库,其中表的一个字段定义为enum('M', 'B')
。我使用的工具将其转换为变体类型。我想覆盖它并将其视为字符。那么问题是,它是否作为字符存储在数据库中?
字符串值不正确:\'\\xCD\\xCF\\xD7\\xA7\\xC9\\xFA...\\
我的服务器上的一切都应该是这样的utf8mb4
,utf8mb4_uca1400_ai_ci
所以让我们来看看一切。
我my.ini
在 Windows 10 上针对 MariaDB 11.4.2 的文件:
[mysql]
default-character-set = utf8mb4
[mysqld]
datadir=C:/WAMP/MariaDB/data
port=3306
innodb_buffer_pool_size=50M
character-set-server=utf8mb4
character-set-client-handshake = FALSE
collation-server = utf8mb4_uca1400_ai_ci
general-log
general-log-file=C:/WAMP/MariaDB/logs/queries.log
[client]
default-character-set = utf8mb4
port=3306
plugin-dir=C:\WAMP\MariaDB/lib/plugin
我用来验证字符集和排序规则的本地查询:
SELECT LOWER(VARIABLE_NAME) AS `variable_name`,
GLOBAL_VALUE AS `global_value`,
DEFAULT_VALUE AS `default_value`
FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES
WHERE VARIABLE_NAME LIKE '%CHARACTER_SET_%'
OR VARIABLE_NAME LIKE '%COLLATION_%'
ORDER BY `VARIABLE_NAME` ASC;
每次进行服务器迁移时,我都会运行以下命令:
SET CHARACTER SET 'utf8';
SET collation_connection = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_connection = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_database = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_server = 'utf8mb4_uca1400_ai_ci';
和SHOW CREATE DATABASE
的回报。utf8mb4
utf8mb4_uca1400_ai_ci
与错误相关的列使用utf8mb4_uca1400_ai_ci
。
这是一封电子邮件,主题为“[标题]满足您对仙侠手游的所有幻想。” 🙄︀ 我猜翻译中有些地方弄错了。虽然我认为我已经涵盖了大多数内容,但我并没有将字符集和排序规则全部最大化。所以...
我还没有正确设置字符集和/或排序规则,以及如何确保所有可能的内容都设置为utf8mb4
和utf8mb4_uca1400_ai_ci
?
我正在通过 LAMPP 使用 MariaDB 在 Arch Linux 上工作,每当我使用 MySQL 工作台并尝试连接到本地数据库时,我都会得到以下信息:
用户“root”尝试连接 127.0.0.1:3306 的 MySQL 服务器失败:
该名称不可激活。
我之所以提到我正在使用 MariaDB,是因为我在测试连接时出现了这个错误:
检测到不兼容/非标准的服务器版本或协议 (10.4.32) <== MariaDB 的版本
尽管出现错误,我仍然可以继续,并且显示它已成功连接到数据库,但是,每当尝试运行 SQL 脚本时,它都无法连接到数据库。
我尝试过:使用其他用户、重新安装 MySQL Workbench、重新安装 XAMPP。但所有这些尝试都徒劳无功。
有没有办法解决这个问题同时保留 MariaDB?
我在 Rhel Linux 上有一个 MariaDB 10.6 服务器,我想为表创建一个触发器。这是我的代码:
DELIMITER //
CREATE TRIGGER before_salary_update
BEFORE UPDATE ON Employee
FOR EACH ROW
BEGIN
DECLARE salary_change DECIMAL(10, 2);
-- Calculate the percentage change in salary
SET salary_change = (NEW.salary - OLD.salary) / OLD.salary * 100;
-- Check if the change is within the 10% threshold
IF salary_change > 10 OR salary_change < -10 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Error: Salary change exceeds 10% limit.';
END IF;
END //
DELIMITER ;
当我使用分隔符运行代码时,我的终端会冻结,我必须使用 ctrl+c 来中断它。当我不使用分隔符执行它时,我收到此错误:
ERROR 1064 (42000) at line 1: 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 '' at line 1
我也尝试将其复制到 sql 文件中并从操作系统执行它。但我遇到了同样的问题。
我正在使用 Galera 复制和 MaxScale 读写器路由器。
我遇到一个问题,因为应用程序是按照这个流程开发的:
- 开始交易
- 更新记录
- 犯罪
- 阅读该记录
结果是使用写入服务器更新记录,下一次读取在读取服务器上完成。由于复制延迟,它无法获取刚刚更新的数据。
不幸的是,重新考虑整个应用程序有点困难,我正在寻找是否存在某种解决方案来强制在写入服务器中进行读取,这样我就可以确保获取刚刚更新的数据。
我设置了一个 mariadb 数据库来记录实验数据。在其中一个表中,我每行都存储了巨大的原始图像。由于每行包含 3 张 512*512px 图像,几百万行数据已经耗尽了磁盘空间。我有 12TB 的磁盘,数据库已经占用了约 10TB。图像之间的差异很小,所以我相信有很大的压缩空间。我想考虑压缩数据库,但由于可用空间有限,我想要一种方法来就地压缩它。我在 Ubuntu 20.04 上使用 mariadb 10.3.39。我不是数据库专家,但我很乐意学习更多。我试过:
ALTER TABLE images ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 ALGORITHM=INPLACE;
我得到了:
ERROR 1064 (42000): 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 'ALGORITHM=INPLACE' at line 1
我还考虑过是否可以将表分成多个块,然后单独压缩每个分区。但是我也不确定对现有表进行分区是否需要更多空间。在盲目尝试之前,我想得到一些建议。
我有一张表格,里面有我们从各种来源收集的数据。它有项目名称、来源和来源值。
该表如下所示:
ID | 姓名 | 来源 | 价值 |
---|---|---|---|
1 | 美国广播公司 | 网络 | 1 |
2 | 美国广播公司 | 打印 | 2 |
3 | 坐标 | 打印 | 8 |
4 | 坐标 | 网络 | 9 |
使用该JSON_OBJECTAGG()
函数,我可以根据名称将源分组在一起:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
这正确给出了:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2} |
坐标 | {"打印":8, "网页":9} |
现在,我想运行该查询,但使用价格/来源的过滤器,因此我运行了以下查询:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
这似乎有效,但是有一个小问题:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2}} |
}
为什么JSON 数据的末尾突然多了一个多余的内容?该HAVING
子句正确地筛选了行,但为什么它会修改结果数据?
在线演示:https ://sqlfiddle.com/mariadb/online-compiler?id=ccf1041c-3ada-4fc9-bd77-2b0fe1428392
我不确定该网站使用哪个版本的 MariaDB,但在我的本地计算机上使用 MariaDB 10.11.9 进行测试得出相同的结果。
编辑:看来我可以通过以下方法解决这个问题:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(JSON_OBJECTAGG(source, value), 2, '$.print')
我只是想避免JSON_OBJECTAGG()
多次写入。此外,虽然这解决了问题,但我仍然很好奇为什么这首先是一个问题。
编辑 2:另一个“修复”是用JSON_OBJECTAGG()
替换GROUP_CONCAT()
。
以下返回正确的数据:
SELECT name,
REPLACE(GROUP_CONCAT(JSON_OBJECT(source, value)), '},{', ',') AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
我的表中有两个布尔列。一个叫做 IsUnlisted,另一个叫做 IsPrivate。如果 IsUnlisted 也为 1 (TRUE),我只想使用检查约束允许 IsPrivate 为 1 (TRUE)。我使用的是 MariaDB,它与 mysql 共享大多数功能。
SHOW VARIABLES LIKE 'general_log%';
+------------------+------------------+
| Variable_name | Value |
+------------------+------------------+
| general_log | ON |
| general_log_file | ff3b5fbeb27b.log |
+------------------+------------------+
在哪里可以找到这个ff3b5fbeb27b.log
文件?
https://dev.mysql.com/doc/refman/8.4/en/query-log.html文档没有提及它应该驻留的任何路径,并且我的搜索告诉我它位于 下/var/log/mysql/
,但不适用于我的情况:
]> system ls -l /var/log/mysql/
total 0
FTA,我的mysql来自最新的docker镜像:mariadb:10.5:
$ mysql -V
mysql Ver 15.1 Distrib 10.5.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
$ uname -rm
6.8.0-1010-azure x86_64