Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Есть pgAdmin III. Он хорош.
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
чтобы исправить косяк того, кто базу создавал. И это правильно. Накосячил — страдай.
CREATE EXTENSION IF NOT EXISTS pg_trgm;CREATE INDEX products_name_index ON products USING GIN (lower(product_name) gin_trgm_ops);SELECT * FROM products where lower(product_name) like '%test%'Нет нормального аналога phpmyadmin.
INSERT IGNORE и INSERT ON DUPLICATE KEY UPDATE
Нет нормального аналога phpmyadmin.
Чтобы работать в продакшене с посгресом, его нужно хорошенько профессионально настроить
Если вы не выставите правильно shared_buffers, настройки автовакуумов и т.д., то на серьёзных нагрузках всё будет медленно работать.
key_buffer (для myisam, по дефолту 8МБ), query_cache_size (кэш запросов запрещен по дефолту), innodb_buffer_pool_size (для innodb, по дефолту 8МБ), innodb_flush_log_at_trx_commit.
test=# CREATE TABLE d1 (d FLOAT);
CREATE TABLE
test=# INSERT INTO d1 VALUES (1.7976931348623157E+308);
INSERT 0 1
test=# SELECT * FROM d1;;
d
-----------------------
1.79769313486232e+308
(1 row)
test=# INSERT INTO d1 VALUES (1.79769313486232e+308);
ERROR: "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" is out of range for type double precision
est=# create table d2(a float8, b float8); CREATE TABLE test=# insert into d2 values (2, 2.0000000000000004); INSERT 0 1 test=# select * from d2; a | b ---+--- 2 | 2 (1 row) test=# select a = b from d2; ?column? ---------- f (1 row)
То есть, вставил число, сделал дамп базы, а дамп потом не импортируется. Круто? :)
postgres=# select 2.1::real - 2;
?column?
--------------------
0.0999999046325684
Мы в MySQL это давно проходили и исправили
test=# select 0.3::float8;
float8
----------------------
0.299999999999999989
test=# select .1::float8;
float8
----------------------
0.100000000000000006
(1 row)
Этот мусор может иметь и более опасные последствия. Поскольку стандарт не гарантирует преобразование без потерь при печати чисел с числом десятичных цифр > DBL_DIG, данные могут искажаться при экспорте/импорте.Стандарт гарантирует минимум 3 лишних цифры, но рекомендует не иметь таких ограничений вообще.
Не существует никакого однозначного соответствия для DBL_DIG+2=17 цифр. А PostgreSQL вообще использует DBL_DIG+3=18. Оно впрочем и для DBL_DIG не существует, это не о том.Согласен, «однозначное соответствие» неудачно сказано. Имелось ввиду что из DBL_DIG+2=17 цифр можно однозначно получить оригинальное бинарное преставление (десятичное представление в этом случае не однозначное). Для double разницы между 17 и 18 нет (IEEE754 гарантирует правильное округление до 20 цифр включительно)
Нет, не всё. Почитайте определение FLT_DIG/DBL_DIG. И ещё почему PostgreSQL сначала использовал extra_float_digits=2, а потом вдруг стал extra_float_digits=3 при экспорте. Тут ссылка уже была.
А теперь главный вопрос: в каком из списков рассылки можно почитать описание проблемы Олега? Ах, ну да, он же никуда и не писал. Но чему тогда удивляться?
The data types real and double precision are inexact, variable-precision numeric types. In practice, these types are usually implementations of IEEE Standard 754 for Binary Floating-Point Arithmetic (single and double precision, respectively), to the extent that the underlying processor, operating system, and compiler support it.
Inexact means that some values cannot be converted exactly to the internal format and are stored as approximations, so that storing and retrieving a value might show slight discrepancies.
слейв всегда ридонли
Для разных же слов существуют тезаурусы, LSI, WordNet и прочие высшие материи.
4. В Mysql можно прямо в запросе оперировать переменными…
В посгресе такого нет, по крайней мере я не нашел (напишите, если ошибся)
do $$
declare x int;
begin
select col1 into x from table1;
end;
$$;
set только для установки локальных или сессионных конфиг-параметров. Это не переменная.\set), то это вообще из другой оперы (только psql, никакого отношения к переменным SQL не имеющая в принципе).do $$
declare x int;
begin
select col1 into x from table1;
select x as result_x;
end;
$$;
raise, по моему как-то так (нет postgres под рукой):do $$
declare x int;
begin
select col1 into x from table1;
raise notice '%', x;
end;
$$;
The code block is treated as though it were the body of a function with no parameters, returning void. It is parsed and executed a single time.
# with recursive counter as (
select 1 as var
union all
select var + 1 as var from counter
where var < 10
)
select var from counter;
var
-----
1
2
3
4
5
6
7
8
9
10
(10 rows)
SELECT row_number() over () as x, * FROM table
В консоли постгрес работает автодополнение, которое может показать все базы, таблицы, поля и т.д. прямо в процессе написания запроса
postgres в каждой базе есть две стандартных схемы
в MySQL тоже работает автодополнение
mysql> select * from use
use user.Create_view_priv user.Insert_priv user.Show_db_priv user.max_questions
user user.Delete_priv user.Lock_tables_priv user.Show_view_priv user.max_updates
user.Alter_priv user.Drop_priv user.Password user.Shutdown_priv user.max_user_connections
user.Alter_routine_priv user.Event_priv user.Process_priv user.Super_priv user.plugin
user.Create_priv user.Execute_priv user.References_priv user.Trigger_priv user.ssl_cipher
user.Create_routine_priv user.File_priv user.Reload_priv user.Update_priv user.ssl_type
user.Create_tablespace_priv user.Grant_priv user.Repl_client_priv user.User user.x509_issuer
user.Create_tmp_table_priv user.Host user.Repl_slave_priv user.authentication_string user.x509_subject
user.Create_user_priv user.Index_priv user.Select_priv user.max_connections user_host
postgres=# S
SAVEPOINT SECURITY LABEL SELECT SET SHOW START
postgres=# SE
SECURITY LABEL SELECT SET
postgres=# SELECT * from pg_t
pg_tables pg_temp_1. pg_timezone_names pg_toast_temp_1. pg_ts_config pg_ts_dict pg_ts_template
pg_tablespace pg_timezone_abbrevs pg_toast. pg_trigger pg_ts_config_map pg_ts_parser pg_type
postgres=# SELECT * from pg_tables where table
tablename tableowner tablespace
CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT LAST_INSERT_ID();
Я утверждаю, что обычные SELECT'ы (т.е. без LOCK IN SHARE MODE и FOR UPDATE) в дефолтном уровне изоляции (то есть, REPEATABLE READ, а не SERIALIZABLE!) никогда не блокируют запись и наоборот.
Чтобы работать в продакшене с посгресом, его нужно хорошенько профессионально настроить. Если вы не выставите правильно shared_buffers, настройки автовакуумов и т.д., то на серьёзных нагрузках всё будет медленно работать.
Возможности PostgreSQL, которых нет в MySQL, и наоборот