MySQL:修訂版本之間的差異
出自福留子孫
(→資料庫設定為「嚴格模式」) |
(→從sql_mode解決問題) |
||
第 49 行: | 第 49 行: | ||
#查看「sql_mode」的值 | #查看「sql_mode」的值 | ||
#*5.7.8版本裡的MySQL,預設了「sql_mode」幾項功能,包含: | #*5.7.8版本裡的MySQL,預設了「sql_mode」幾項功能,包含: | ||
− | #*# | + | #*# STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止 |
+ | #*#*不可對 not null 欄位插入 null 值 | ||
+ | #*#*不可對自動遞增欄位插入值 | ||
+ | #*#*text 欄位不可以有預設值 | ||
+ | 如果出現在最前面, | ||
#*# NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權 | #*# NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權 | ||
#*# NO_ZER0_DATE:日期「0000-00-00」此種類型的值是不合法的 | #*# NO_ZER0_DATE:日期「0000-00-00」此種類型的值是不合法的 |
2022年7月22日 (五) 18:33的修訂版本
目錄
新舊版更迭
MySQLi
跨伺服器叫用 MySQL
被叫用端設定
- 設定一個帳號:
- HOST 為允許叫用的 ip ,不能用域名或 server 網址。所有 ip 登入,Host設置為 '%' 。
- 設定帳號密碼,並以最保守的立場設定對諸資料表的權限。
- flush privileges;
- /etc/my.cnf中的相關設定:
- [mysqld]內新增一行:skip-name-resolve,關閉 MySQL DNS 反向解析。但伺服器會把在本機登入的使用者自動解析為'root'@'127.0.0.1';而不是'root'@'localhost';,如果權限表不合就會出問題。
- [mysqld]內新增一行:lower_case_table_names=1,使MySQL忽略資料庫表名大小寫
- 打開 3306 port
戰國策租賃主機不允許名外部叫用內部的 MySQL 。
檢測被叫用的伺服器
- 網路檢測:
- ping主機可以;
- telnet 主機3306端口不可以;
- telnet 主機22端口可以;
- 跟伺服器沒關係
- 端口檢測:
- netstat -ntpl |grep 3306 得到 「tcp 0 0 :::3306 :::* LISTEN -」
- netstat -ntpl |grep 22 得到 「tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -」
- 22端口監聽所有地址,而3306只監聽本機地址(綁定了到了本地),所以遠程無法訪問。修改my.cnf 中bind-address=0.0.0.0
對於端口只允許本機訪問,有兩個相關設定,一個是防火牆擋3306,一個就是mysql配置綁定本機地址。
- 防火牆檢測:
- iptables --list查看;
- 開啟防火牆3306端口:在 iptables 中加「-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT」,防火牆允許3306端口通過。
- 或者直接關閉防火牆;
- mysql配置文件檢查:
- my.cnf的配置,bind-address=addr可以配置綁定ip地址。不配置或者IP配置為0.0.0.0,表示監聽所有客戶端連接。
- ps -aux | grep mysql 查看進程ID是3340
- ll /proc/3340 查看進程程序情況,找配置文件
- 或以 which mysql 找程序路徑
- my.cnf的配置,bind-address=addr可以配置綁定ip地址。不配置或者IP配置為0.0.0.0,表示監聽所有客戶端連接。
叫用端設定
DB::connect("mysql://帳號:密碼@被叫用伺服器:3306/資料庫名");
資料庫設定為「嚴格模式」
「嚴格模式」(Strict Mode)下:
- 欄位若沒有預設值則不能插入
- BLOB/TEXT 欄不能設預設值
從sql_mode解決問題
步驟:
- 從adminer登入
- 點選「變數」
- 查看「sql_mode」的值
- 5.7.8版本裡的MySQL,預設了「sql_mode」幾項功能,包含:
- STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止
- 不可對 not null 欄位插入 null 值
- 不可對自動遞增欄位插入值
- text 欄位不可以有預設值
- STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止
- 5.7.8版本裡的MySQL,預設了「sql_mode」幾項功能,包含:
如果出現在最前面,
- NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權
- NO_ZER0_DATE:日期「0000-00-00」此種類型的值是不合法的
- NO_ZERO_IN_DATE
- NO_ENGINE_SUBSTITUTION:如果存儲引擎被禁用或未編譯,此項功能會直接拋出錯誤;沒有設置此值時,create用預設的存儲引擎替代,alter不進行更改,並拋出一個warning。
- ONLY_FULL_GROUP_BY:如果在 select 中的筆/欄,沒有在 group by 中出現,那這個指令是不合法的。
- ERROR_FOR_DIVISION_BY_ZERO:在 insert 或 update 的過程中,如果數據被零除,則產生錯誤而非警告。如果未給出該模式,那麼數據被零除時 MySQL 返回 NULL
- 從PHP裡修改:
- 使用SET_SESSION,將sql_mode裡的值設為“”(空字串)。
- 將語法寫成:
sql_mode=’STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION’
資料來源:
MySQL 5.7:聊聊sql_mode
sql-mode
DB_MySQL:SQL-Mode的設定
Mysql ERROR 1067: Invalid default value for ‘date’ 解決