mysql安裝
migration 兼容處理
pg數據導入
sql 兼容處理
mysql | pg 同步
rails mysql 支持
mysql 設置編碼爲utf8mb4(
1.utf8 是 Mysql 中的一種字符集,只支持最長三個字節的 UTF-8字符;
2.要在 Mysql 中保存 4 字節長度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後
3. 對於 CHAR 類型數據,utf8mb4 會多消耗一些空間,根據 Mysql 官方建議,使用 VARCHAR 替代 CHAR
)
設置utf8mb4:
cat /usr/local/etc/my.cnf
character-set-server=utf8mb4
mysql.server stop
mysql.server start
mysql -uroot -p123456
show variables like 'character_set_database';
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
已有的庫和表更改爲utf8mb4
#更改數據庫編碼:
ALTER DATABASE 數據庫名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
#更改表編碼:
ALTER TABLE 表名CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如有必要,還可以更改列的編碼
MySql錯誤:ERROR 1449 (HY000)
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
SET GLOBAL innodb_fast_shutdown = 1;
quit
調用mysql_upgrade升級mysql後,需要重啓mysql才能讓系統表更新生效
mysql_upgrade -u root -p;
重新登錄之後,服務恢復正常。
rails mysql string -> varchar(255);
rails pg string -> varchar
rails pg money -> rails mysql integer
Rails 5 中會用一張ar_internal_metadata表在執行Migration的過程中把要保護的數據庫環境信息存儲到其中,然後在執行高危動作時自動對環境做偵測預判。
db_2ccm_production=# select * from ar_internal_metadata;
key | value | created_at | updated_at
-------------+------------+----------------------------+----------------------------
environment | production | 2017-07-13 17:37:26.683599 | 2017-07-13 17:37:26.683599
rails 內置表 ar_internal_metadata 不能同步
50000+的數據使用transaction方式 同步會出現錯誤
[array] partner_order_item: invoice_numbers | refund_invoice_numbers users: exchange_code_array | platforms
mysql 不支持 with_advisory_lock Model.with_advisory_lock('transaction_name', transaction: DB.postgresql?)
事務塊 裏面的 Transaction-level locks
mysql 不支持 reset_pk_sequence 重置序列
pg ActiveRecord::Base.connection.reset_pk_sequence!(table_name) mysql ActiveRecord::Base.connection.execute("ALTER TABLE #{table_name} AUTO_INCREMENT = #{new_max_id};")
mysql 不支持 array 類型的字段
pg add_column table_names, column, :string, array: true, default: [] mysql add_column table_names, column, :text
mysql ALTER TABLE table AUTO_INCREMENT = max_id
TRUNCATE table table_name could drop all table data
mysql 不支持 like serialize columns
OpenSSL::Cipher::AES ruby 2.5.0 出現問題 aes加密 iv截取16位
mysql 不支持 ROW_NUMBER
PG
SELECT
id
FROM (
SELECT
id,
ROW_NUMBER()
OVER (PARTITION BY
start_sale_time
ORDER BY
start_sale_time DESC) AS rank
FROM
auction_products
WHERE
status = #{AuctionProduct.statuses[:presale]}) aps
WHERE
aps.rank <= 8
MYSQL
SELECT
id
FROM(
SELECT
id,start_sale_time,
if(@current_timestamp > UNIX_TIMESTAMP(start_sale_time),@rank:=@rank+1,@rank) as the_rank,
@current_timestamp := UNIX_TIMESTAMP(start_sale_time) as the_time
FROM
auction_products
WHERE
status = #{AuctionProduct.statuses[:presale]}
ORDER BY start_sale_time desc
) aps
WHERE
aps.the_rank <= 8
mysql 時區設置
show variables like “%time_zone%”;
set global time_zone = ‘+8:00’; ##修改mysql全局時區爲北京時間,即我們所在的東8區
set time_zone = ‘+8:00’; ##修改當前會話時區
flush privileges; #立即生效
mysql extract different with pg
pg extract(‘year’ from time_column) = ?", time.strftime(’%Y’)
mysql extract(year from time_column) = ?", time.strftime(’%Y’)
mysql unsupport pg_search use like or aliyun
用戶首頁: year too big to marshal: 1899 UTC
users.platforms sql更換
update users set users.platforms = case platforms when “” then “—” else concat("—\n- “, REPLACE(REPLACE(REPLACE(REPLACE(users.platforms, “[”,”"), “]”,""), “,”,"\n- "), “’”, “”)) end
索引長度限制 set innodb_large_prefix on
update taggings set taggings.context=“tags”;
sudo apt-get install libmysqlclient-dev
數據格式限制
➜ 2ccm-work-api git:(release) rails db:migrate
== 20190410033249 AddRefundIdentification: migrating ==========================
-- add_column(:trade_orders, :refund_identification, :string)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Invalid default value for 'created_at': ALTER TABLE `trade_orders` ADD `refund_identification` varchar(255)
解決: mysql> SET GLOBAL sql_mode = '';
PostgresToMysql功能介紹
1、可以將PostgreSQL數據轉換成mysql數據;
2、支持批量轉換;
3、支持命令行操作;
4、支持重複操作;
5、支持在指定的時間自動操作;
6、可以使用SQL命令查詢操作。