此行为是否记录在某处并且可以启用全双精度吗?
重现查询:
select 1e-130; /* 0.0...1 result */
select 1e-131; /* 0 result */
在线重现: https: //dbfiddle.uk/5uwlkJaB
此行为是否记录在某处并且可以启用全双精度吗?
重现查询:
select 1e-130; /* 0.0...1 result */
select 1e-131; /* 0 result */
在线重现: https: //dbfiddle.uk/5uwlkJaB
基于Sqlite文档: https: //www.sqlite.org/datatype3.html#type_conversions_prior_to_comparison,特别是这个声明:
如果一个操作数具有 INTEGER、REAL 或 NUMERIC 关联性,而另一操作数具有 TEXT 或 BLOB 或无关联性,则 NUMERIC 关联性将应用于另一操作数。
我期望以下查询:
CREATE TABLE `invoice` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`amount` DOUBLE PRECISION DEFAULT NULL
);
insert into `invoice` (`amount`) values (4.0);
insert into `invoice` (`amount`) values (15.0);
insert into `invoice` (`amount`) values (4.0);
select *,
typeof(amount), amount = '4',
typeof(sum(amount)), sum(amount) = '4', sum(amount) = '4.0', sum(amount) = 4
from invoice
group by id;
sum(amount) = '4'
为每行返回相同的结果,amount = '4'
因为两个操作数类型在每次比较中都具有相同的类型(使用typeof()
, for non进行验证SUM()
,比较是否按预期工作)。
SQL 不仅仅是文字:
CREATE TABLE "currency" ("id" NUMBER(10) NOT NULL, "currency" VARCHAR2(50) NOT NULL, "name" VARCHAR2(1020) DEFAULT NULL NULL, PRIMARY KEY("id"));
CREATE TABLE "user" ("id" NUMBER(10) NOT NULL, "name" VARCHAR2(1020) DEFAULT NULL NULL, "currency" VARCHAR2(50) DEFAULT NULL NULL, PRIMARY KEY("id"));
CREATE UNIQUE INDEX IDX_6956883FFF467AE9 ON "currency" ("currency");
ALTER TABLE "user" ADD CONSTRAINT FK_8D93D6496956883F6956883F695 FOREIGN KEY ("currency") REFERENCES "currency" ("currency");
ORA-02270: 此列列表没有匹配的唯一键或主键
列类型相同,并添加了唯一索引。
为什么无法添加 FK?
基于 Sqlite 文档:https://www.sqlite.org/datatype3.html#type_conversions_prior_to_comparison,尤其是这个语句:
如果一个操作数具有 INTEGER、REAL 或 NUMERIC 亲和性,而另一个操作数具有 TEXT 或 BLOB 或没有亲和性,则将 NUMERIC 亲和性应用于其他操作数。
我期望以下查询:
CREATE TABLE t (id integer primary key, str varchar(20));
INSERT INTO t (id, str) VALUES (1, '5'), (2, '5u');
SELECT id, 5 = str, 5 >= str, CAST(5 AS NUMERIC) >= str, CAST(str AS NUMERIC) FROM t;
为两行返回5 >= str
= 1
,因为左侧操作数具有 NUMERIC 亲和性。
如何更改列出的默认排序规则SHOW CHARACTER SET
?
因为utf8
我需要将其更改为utf8_unicode_ci
.
或者是否有任何开关可以对任何 UTF8xx 字符集强制执行_unicode_ci
over ?_general_ci
我已阅读有关FORCE
索引的文章,但如何强制 MySQL 建立IGNORE ALL
索引?
我试过SELECT * FROM tbl IGNORE INDEX(*)
了,但我没有成功。
至于为什么我(和其他人)需要这样做:例如,我需要像这样通过 tld 总结引用统计信息:
SELECT
count(*) as c,
SUBSTRING
(
domain_name,
LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2
) as tld
FROM `domains_import`
IGNORE INDEX(domain_name)
GROUP BY tld
ORDER BY c desc
LIMIT 100
...但我总是必须查看定义了哪些索引或通过解释确定将使用哪些索引。IGNORE INDEX ALL
简单地写而不关心会非常方便。
有谁知道语法或黑客?(几十行通过MySQL定义表确实不是捷径)。
基准:
无索引 = 148.5 秒
索引 = 180 秒并且仍在运行 发送数据 SSD 阵列非常强大,您几乎不需要关心数据缓存...
基准的定义:
CREATE TABLE IF NOT EXISTS `domains_import` (
`domain_id` bigint(20) unsigned NOT NULL,
`domain_name` varchar(253) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `domains_import`
ADD PRIMARY KEY (`domain_id`),
ADD UNIQUE KEY `domain_name` (`domain_name`);
ALTER TABLE `domains_import`
MODIFY `domain_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT;
InnoDB,带有索引的测试(没有 USE INDEX() 或类似的)仍在运行,250 秒,我刚刚杀了它。