修復確實取決於拋出錯誤的語句。
基本上,MySQL抱怨=
兩邊的表達式,即字符集/排序規則不兼容。
錯誤是由於比較兩個表達式之間的字符集不匹配造成的。
我通常運行到此錯誤,當我運行創建內嵌視圖(派生表)的聲明,和所導出的表(如預期)與客戶端連接的字符集創建,然後在外部查詢的相等比較從具有不兼容的字符集,例如一個表到列製成:
SELECT l.latin1col
FROM latin1table l
JOIN (SELECT 'utf8string' AS utf8col) s
ON s.utf8col = l.latin1col
在共線視圖的列的字符集沒有被指定,因此派生表繼承來自character_set_connection
可變。一種可能的解決方法是更改會話的變量設置。 (然後,語句運行時,在派生表中的列將是字符集。)
另一個解決辦法是指定字符集爲行內視圖,例如列
SELECT l.latin1col
FROM latin1table l
JOIN (SELECT _latin1'utf8string' AS latin1col) s
-- ^^^^^^^
ON s.latin1col = l.latin1col
要解決你的問題,你需要找出哪些表達式是字符集,並在一側或其他適當的調整。
即,是cp1251_general_ci
覈對從所述客戶端連接到來,或者是從表列。
如果您在語句中使用文字,您可以將其轉換爲合適的字符集/排序規則,以便與具有CONVERT
函數的不同字符集/排序規則的列進行比較...
例如,而不是這樣的:
WHERE col = 'myliteral'
你可以做這樣的事情:
WHERE col = CONVERT('myliteral' USING latin1)
- 或 - 用文字值,你也可以做到這一點
WHERE col = _latin1'myliteral'
如果您還需要指定排序規則,您可以按照與COLLATE關鍵字和指定排序規則有效的字符集:
WHERE col = CONVERT('myliteral' USING latin1) COLLATE latin1_swedish_ci
這不是從你的問題是什麼character_set_connection
和collation_connection
變量設置爲清晰。
SELECT @@session.character_set_connection
, @@session.collation_connection
, @@global.character_set_connection
, @@global.collation
還是什麼在你的數據庫中的字符列(S)的字符集和校對規則設置,
SHOW CREATE TABLE mytable;
注:
在該字符集設置數據庫級別是默認值值應用於添加到數據庫的新表e定義了一個字符集/排序規則。
表的「默認字符集」設置是將用於未添加指定字符集/排序規則的新列的字符集。
發出語句來更改字符集像這樣的表:
ALTER TABLE mytable CHARACTER SET latin1 COLLATE latin1_swedish_ci
不不改變字符集或排序規則中已有的表列中。它隻影響添加的新列,沒有指定的字符集/排序規則。同樣的事情適用於ALTER DATABASE
聲明......它對現有的表和列沒有任何影響,只對新創建的表沒有指定字符集/排序規則。
的'SHOW COLLATION'聲明將給予有效charactersets的列表,數據庫的排序規則。請注意,字符集可以有多個排序規則,但每個字符集都有一個* default *排序規則,在未指定排序規則時使用。另外,這裏是對MySQL CONVERT(... USING ...)語法的參考。 [https://dev.mysql.com/doc/refman/5.5/en/charset-convert.html](https://dev.mysql.com/doc/refman/5.5/en/charset-convert.html) MySQL參考手冊中有關於字符集和歸類的更多信息。 – spencer7593