MySQL:修訂版本之間的差異

出自福留子孫
跳轉到: 導覽搜尋
被叫用端設定
資料庫設定為「嚴格模式」
第 43 行: 第 43 行:
 
#欄位若沒有預設值則不能插入
 
#欄位若沒有預設值則不能插入
 
#BLOB/TEXT 欄不能設預設值
 
#BLOB/TEXT 欄不能設預設值
===從sql_mode解決問題===
+
MariaDB 10 或 MySQL 5.7.8 版本裡預設了「sql_mode」幾項功能,可以用 adminer 登入,然後查伺服器的「變數」,其中「sql_mode」的值包含:
步驟:
+
#STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止
#從adminer登入
+
#*不可對 not null 欄位插入 null 值
#點選「變數」
+
#*不可對自動遞增欄位插入值
#查看「sql_mode」的值
+
#*text 欄位不可以有預設值
#*5.7.8版本裡的MySQL,預設了「sql_mode」幾項功能,包含:
+
#ERROR_FOR_DIVISION_BY_ZERO:在 insert 或 update 時,若數據被零除,則產生錯誤而非警告。若未設此值,則數據被零除時 MySQL 返回 NULL
#*# STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止
+
#NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權
#*#*不可對 not null 欄位插入 null 值
+
#NO_ENGINE_SUBSTITUTION:若存儲引擎被禁用或未編譯,此項功能會直接拋出錯誤;若未設此值, create 用預設的存儲引擎替代, alter 不進行更改,並拋出一個 warning。<br/>-----更多的嚴格模式值-----
#*#*不可對自動遞增欄位插入值
+
#NO_ZER0_DATE:日期「0000-00-00」的值不合法
#*#*text 欄位不可以有預設值
+
#NO_ZERO_IN_DATE:日期「2010-01-00」的值不合法,因為日期不可為 0
#*# NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權
+
#ONLY_FULL_GROUP_BY:若 select 中的欄、HAVING 或者 ORDER BY 中的欄,沒有在 group by 中出現,那麼這個 SQL 不合法
#*# 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’
+
  
 +
===解決方法===
 +
#PHP 連結資料庫一成功,馬上送入「SET SESSION sql_mode=''」,在本次會期中取消嚴格模式
 +
#或將語法寫成:「SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'」保留部分嚴格模式
  
 
資料來源:
 
資料來源:
 +
#[https://www.azureunali.com/dbmysql-sql-mode的設定/ DB_MySQL:SQL-Mode的設定]
 
#[https://www.cnblogs.com/liukaifeng/p/10103810.html MySQL 5.7:聊聊sql_mode]
 
#[https://www.cnblogs.com/liukaifeng/p/10103810.html MySQL 5.7:聊聊sql_mode]
 
#[https://guhusu.gitbooks.io/mysql-note/content/sql-mode.html sql-mode]
 
#[https://guhusu.gitbooks.io/mysql-note/content/sql-mode.html sql-mode]
#[https://www.azureunali.com/dbmysql-sql-mode%E7%9A%84%E8%A8%AD%E5%AE%9A/ DB_MySQL:SQL-Mode的設定]
+
#[https://www.796t.com/p/1115259.html Mysql ERROR 1067: Invalid default value for 'date' 解決]
#[https://www.796t.com/p/1115259.html Mysql ERROR 1067: Invalid default value for ‘date’ 解決]
+
  
 
==密碼複雜度與密碼過期策略==
 
==密碼複雜度與密碼過期策略==
 
===一、密碼複雜度策略設定===
 
===一、密碼複雜度策略設定===

2023年2月8日 (三) 15:15的修訂版本

新舊版更迭

MySQLi

mysqli函式

跨伺服器叫用 MySQL

被叫用端設定

  1. 設定一個帳號:
    • HOST 為允許叫用的 ip ,不能用域名或 server 網址。所有 ip 登入,Host設置為 '%' 。
    • 設定帳號密碼,並以最保守的立場設定對諸資料表的權限。
    • flush privileges;
  2. /etc/my.cnf中的相關設定:
    • [mysqld]內新增一行:skip-name-resolve,關閉 MySQL DNS 反向解析。但伺服器會把在本機登入的使用者自動解析為'root'@'127.0.0.1';而不是'root'@'localhost';,如果權限表不合就會出問題。
    • [mysqld]內新增一行:lower_case_table_names=1,使MySQL忽略資料庫表名大小寫
  3. 打開 3306 port

戰國策租賃主機不允許外部叫用內部的 MySQL 。?但資料庫伺服器明明和網頁伺服器分開啊?

檢測被叫用的伺服器

  1. 網路檢測:
    • ping主機可以;
    • telnet 主機3306端口不可以;
    • telnet 主機22端口可以;
    跟伺服器沒關係
  2. 端口檢測:
    • 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配置綁定本機地址。
  3. 防火牆檢測:
    • iptables --list查看;
    • 開啟防火牆3306端口:在 iptables 中加「-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT」,防火牆允許3306端口通過。
    • 或者直接關閉防火牆;
  4. mysql配置文件檢查:
    • my.cnf的配置,bind-address=addr可以配置綁定ip地址。不配置或者IP配置為0.0.0.0,表示監聽所有客戶端連接。
      1. ps -aux | grep mysql 查看進程ID是3340
      2. ll /proc/3340 查看進程程序情況,找配置文件
    • 或以 which mysql 找程序路徑

叫用端設定

DB::connect("mysql://帳號:密碼@被叫用伺服器:3306/資料庫名");

資料庫設定為「嚴格模式」

「嚴格模式」(Strict Mode)下:

  1. 欄位若沒有預設值則不能插入
  2. BLOB/TEXT 欄不能設預設值

MariaDB 10 或 MySQL 5.7.8 版本裡預設了「sql_mode」幾項功能,可以用 adminer 登入,然後查伺服器的「變數」,其中「sql_mode」的值包含:

  1. STRICT_TRANS_TABLES:不合法的值會導致整個 SQL 指令出錯中止
    • 不可對 not null 欄位插入 null 值
    • 不可對自動遞增欄位插入值
    • text 欄位不可以有預設值
  2. ERROR_FOR_DIVISION_BY_ZERO:在 insert 或 update 時,若數據被零除,則產生錯誤而非警告。若未設此值,則數據被零除時 MySQL 返回 NULL
  3. NO_AUTO_CREATE_USER:不自動創建用戶,必須先建立用戶才能授權
  4. NO_ENGINE_SUBSTITUTION:若存儲引擎被禁用或未編譯,此項功能會直接拋出錯誤;若未設此值, create 用預設的存儲引擎替代, alter 不進行更改,並拋出一個 warning。
    -----更多的嚴格模式值-----
  5. NO_ZER0_DATE:日期「0000-00-00」的值不合法
  6. NO_ZERO_IN_DATE:日期「2010-01-00」的值不合法,因為日期不可為 0
  7. ONLY_FULL_GROUP_BY:若 select 中的欄、HAVING 或者 ORDER BY 中的欄,沒有在 group by 中出現,那麼這個 SQL 不合法

解決方法

  1. PHP 連結資料庫一成功,馬上送入「SET SESSION sql_mode=」,在本次會期中取消嚴格模式
  2. 或將語法寫成:「SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'」保留部分嚴格模式

資料來源:

  1. DB_MySQL:SQL-Mode的設定
  2. MySQL 5.7:聊聊sql_mode
  3. sql-mode
  4. Mysql ERROR 1067: Invalid default value for 'date' 解決

密碼複雜度與密碼過期策略

一、密碼複雜度策略設定