簡體   English   中英

Rails應用程序的utf8mb4字符集

[英]utf8mb4 character set for Rails application

我正在使用MySQL版本5.7.12; 我正在嘗試在文本字段中添加表情符號支持。 我找到了這篇文章。 它指出要更改表和列以啟用utf8mb4,它支持真正的unicode,包括4字節unicode字符。 我有一個表注釋和文本字段內容,因此我執行以下操作:

class ConvertCommentsToUtf8mb4 < ActiveRecord::Migration
  def change
    # for each table that will store unicode execute:
    execute "ALTER TABLE comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
    # for each string/text column with unicode content execute:
    execute "ALTER TABLE comments CHANGE content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
  end
end

當我嘗試運行遷移時,出現以下錯誤:

Mysql2 :: Error:您的SQL語法有錯誤; 在第1行的'SET utf8mb4 COLLATE utf8mb4_bin'附近,請檢查與您的MySQL服務器版本相對應的手冊以使用正確的語法:ALTER TABLE注釋更改內容TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin / Users / myuser / .rvm / gems / ruby​​- 2.1.2@core/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:在_query中

我可能做錯了什么?

當您使用ALTER TABLE...CHANGE您需要輸入兩次列名,因為CHANGE允許您更改列名。

ALTER TABLE comments CHANGE content TEXT CHARACTER SET ...

在這種情況下,它認為您正在將列名稱更改為TEXT,數據類型為CHARACTER(這是合法數據類型,它是CHAR(1)的同義詞),然后在找到單詞SET時感到困惑。

因此,您可以通過以下兩種方式之一對其進行修復:

ALTER TABLE comments CHANGE content content TEXT CHARACTER SET ...

ALTER TABLE comments MODIFY content TEXT CHARACTER SET ...

MODIFY就像CHANGE一樣,但是不能更改列的名稱,因此您不需要兩次拼出列名。

這就是語法錯誤的解釋,但是FWIW您不需要在對整個表使用CONVERT TO CHARACTER SET之后修改文本列。 MySQL自動更改表中所有字符串列的字符集和排序規則。


演示:

mysql> create table comments ( content text ) character set utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> alter table comments convert to character set utf8mb4;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into comments set content = 0xF09F92A9;
Query OK, 1 row affected (0.01 sec)

mysql> select * from comments;
+---------+
| content |
+---------+
| 💩        |
+---------+
sql = "ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4  
COLLATE utf8mb4_unicode_ci;"
records_array = ActiveRecord::Base.connection.execute(sql)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM