如題,在使用網站代管商的主機服務,上傳MYSQL時發生#1071的問題
上網查了解決方式https://www.oschina.net/question/87533_10510
想請問各位大大,遇到這個問題該怎麼解決呢?
他不是已經跟你說了,將mysql的engine更改為InnoDB就可以了。
應該是longblob的問題,
你到底想要放什麼東西?
sql檔放入後變這樣了= =
Uncaught exception thrown in shutdown function.
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vhost114055.semaphore' doesn't exist: DELETE FROM {semaphore} WHERE (value = :db_condition_placeholder_0) ; Array ( [:db_condition_placeholder_0] => 57332699859549729028bf5.82426611 ) in lock_release_all() (line 269 of /raid/vhost/glb-bio.com/www/includes/lock.inc).
你的SQL語法感覺怪怪的,你可以把SQL語法相關的PO出來嗎?
還有,你是用什麼語言寫的?
是用MYSQL,外包商寫的所以我也不知道怎麼PO出來欸,網頁是用PHP
另外現在問題變成這個了
不知道怎麼PO出來要怎麼幫你解決,你可能要請人去你那邊幫你看了,不過如果無法改源碼也沒辦法,重新寫一個吧。
小魚,你好,
這部分我也不熟,純討論一下,
雖然該篇文章說到,
最後的解決方式是改為 InnoDB,
但其實此版主的 create
確實是使用 ENGINE=InnoDB
,
不知道您有沒有注意到,
另外就是,
據爬文結果,
InnoDB 也是會出現類似的問題,而且限制的 byte 更小,只有 767 bytes,
至於為什麼該篇文章會改成 InnoDB 就成功我也不解@@
或許是更早以前的版本沒有此限制(!?)
或是我誤解了什麼...
我在另一個討論區給的回覆解法是,以下二擇一
1.把 aid 的長度改成 191
2.把 CHARSET 改成 utf-8
版主,你好,
最後出現的這個 unserialize()
問題,
就跟 mysql 沒關係了,
純粹是 PHP 的問題,
可以爬文一下,或是另發一個主題來詢問,
但標籤記得是 PHP ,也記得引此篇討論可以做參考。
如果只是 unserialize()
問題應該不大,但前提是版主要會改 PHP 。
謝謝您詳盡的回覆!!
資料表是Innodb,那資料庫是不是Innodb?MySql應該是有設定檔可以看的,我之前只改過Linux的,Windows的設定檔我倒是不知道在哪裡...
InnoDB的index prefix限制是767Bytes, 小於MyISAM的1000Bytes, 但為什麼文章中改為InnoDB會解決問題? 故意留下一個謎團?
文章沒說到的, 我在這裡解謎: 他打開了InnoDB在MySQL 5.7.6之前版本預設關閉的innodb-large-prefix, 這個參數可增大InnoDB index prefix的限制為3072Bytes. 如果您使用MySQL 5.7.6以前的版本, 請打開innodb-large-prefix.
原來是這樣,會不會跟版本有關係,
我的版本是5.7.10,
剛剛同時塞了800多個字進去兩個欄位沒出現任何錯誤。
是索引Index的限制, 不是欄位field的限制.
喔喔,終於了解了
話說回來,
索引要那麼長做什麼 @@
聯合索引時兩個或以上的欄位加總的索引會很長. 但也應該盡量避免對常用的邏輯做長索引, 最好能用商業邏輯或其他方案解決.
所以所謂767Bytes是 單一資料表 全部的索引 大小加起來?
這限制是對單一索引INDEX. 一個資料表有一個或以上的索引, 每一個單一索引可能對一個或以上的欄位排序.
恩恩,所謂的單一索引是指 所有的PRIMARY、所有的INDEX、所有的UNIQUE,這個意思嗎?
所以意思是所有的INDEX的大小總和,不能超過這個大小,但是PRIMARY + INDEX + UNIQUE的總和可以超過這個大小,是這個意思嗎?
單一索引的Prefix限制是這個索引所含的一個或一個以上欄位的Index Prefix相加. 不是跨索引的相加.
Primary必是一個索引, 定某一個欄位為Unique也是一個索引, INDEX是一個特別建立的單一索引. 每一個"單一"索引. 不是所有的"單一"索引相加.
所以MySql的那個數值適用於:
1.Primary單一欄位不能超過那個值
2.Unique單一欄位不能超過那個值
3.Index單一索引所有欄位加起來也不能超過那個值
這三個條件只要有一個不成立就會拋出錯誤,是這樣嗎?
欄位的Index Prefix長度相加, 不一定是欄位的長度相加:
index prefix是指一個欄位前面的多少字元要用來建立索引, 也就是忽略了這個欄位在prefix之後的字元, 例如, 一個欄位長度可能是255, 但index prefix設為100, 這時是只用前100個字元來索引. 為什麼index prefix要設得比欄位長度來的短? 這是商業邏輯的判斷. 當然, 通常不設定index prefix, 也就是用全欄位來索引.
1.Primary所有欄位的index prefix相加不能超過那個值
2.Unique欄位的index prefix不能超過那個值
3.Index所有欄位的index prefix相加不能超過那個值
了解,感恩~
減少 aid 欄位的長度
由原
aid VARCHAR(255) NOT NULL
改成
aid VARCHAR(191) NOT NULL
試試看
如果想知道為什麼的話
再看這篇詳細說明