最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MySQL中的字符集和排序規(guī)則

 更新時間:2023年09月12日 09:06:00   作者:fliter  
MySQL字符集用于定義數(shù)據(jù)庫中存儲的文本數(shù)據(jù)的編碼格式,而排序規(guī)則則用于確定如何對文本數(shù)據(jù)進行排序和比較,本文將給大家講講MySQL中的字符集和排序規(guī)則,需要的朋友可以參考下

關鍵字: 字符集,utf8mb4,emoj

眾所周知,mysql的utf8是假的utf8,沒法存emoj等字符。要設置為utf8mb4...

問題

同事給了一段Update語句,更新某張表id=xxx的某個字段;

CREATE TABLE `table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `xxx_id` int(11) NOT NULL,
  `description` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `max_xxx` int(11) NOT NULL DEFAULT '0',
  `max_xxx` int(11) NOT NULL DEFAULT '0',
  `xxx_generate_method` tinyint(4) NOT NULL,
  `xxx_generate_method` tinyint(4) NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_table_name_xxx_id` (`xxx_id`),
  KEY `idx_table_name_end_time` (`end_time`),
  KEY `idx_table_name_start_time` (`start_time`)
) ENGINE=InnoDB AUTO_INCREMENT=5822 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

登陸跳板機,連接遠程數(shù)據(jù)庫后,執(zhí)行sql,報錯: ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x93\xA3Ev...'

\xF0\x9F\x93\xA3恰好是轉義之后的emoj

這張表所在的庫的字符集是utf8,但是表指定了是utf8mb4,字段沒有指定,僅指定了排序方式為 utf8mb4_unicode_ci

據(jù)說,字符集規(guī)則會按照 字段設置>表設置>庫設置的順序。

此處 這個字段沒有設置字符集,那應該用表的字符集即*DEFAULT CHARSET=utf8mb4 *

(且經過試驗,如果COLLATE=utf8mb4_unicode_ci,那字符集不可能是utf8,只可能是utf8mb4,不然報錯時會直接報錯)

下面補充一些mysql字符集的知識

查看庫級別的 字符集和編碼設置

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Variable_name
character_set_client
character_set_connection
character_set_database
character_set_filesystem
character_set_results
character_set_server
character_set_system
character_sets_dir 

這都是干啥的?

這些變量是 MySQL 中與字符集相關的變量,用于控制不同環(huán)境中的字符集設置。以下是對每個變量的簡要說明:

  1. character_set_client : 客戶端連接到 MySQL 服務器時所使用的字符集。
  2. character_set_connection : 當前連接的默認字符集。它可以在客戶端連接時通過 SET NAMES 命令來設置。
  3. character_set_database : 默認數(shù)據(jù)庫的字符集。在創(chuàng)建數(shù)據(jù)庫時設置,新創(chuàng)建的表將繼承該字符集。
  4. character_set_filesystem : 文件系統(tǒng)的默認字符集。用于存儲文件名和路徑的字符集。
  5. character_set_results : 返回給客戶端的結果集的字符集。
  6. character_set_server : MySQL 服務器的默認字符集。用于新建數(shù)據(jù)庫、表和列的默認字符集。
  7. character_set_system : MySQL 系統(tǒng)數(shù)據(jù)字典和內部字符串的字符集。
  8. character_sets_dir : MySQL 字符集定義文件的目錄路徑。

這些變量的設置是相互關聯(lián)的,通過調整它們的值可以控制 MySQL 在不同環(huán)境中的字符集行為。確保這些變量的值一致并與你的應用程序和數(shù)據(jù)的字符集一致,可以確保正確地存儲、傳輸和顯示數(shù)據(jù)。

注意:在修改這些字符集相關的變量之前,請確保了解其含義和影響,并在備份數(shù)據(jù)的情況下謹慎操作。修改字符集設置可能會對現(xiàn)有數(shù)據(jù)和應用程序產生影響。

一般說的字符集和排序規(guī)則,應該主要看

SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';

查看表級別的字符集和編碼設置

SHOW CREATE TABLE `your_table_name`;

能得到建表語句,看最后的 DEFAULT CHARSET

具體到table的column的字符集如何查看?

SHOW FULL COLUMNS FROM your_table_name;

在查詢結果中,查找 "Collation" 列。該列顯示每個列(字段)的字符集和排序規(guī)則。

請注意,"Collation" 列中的值表示字符集和排序規(guī)則的組合。常見的字符集包括 UTF-8(如 utf8mb4)和 Latin1(如 latin1)。

Collation 本意是??保χ?,在數(shù)據(jù)庫中 是排序規(guī)則

這個字段的第一部分,其實已經指明了字符集...所以SHOW FULL COLUMNS沒有必要再多一個字符集列

那么,問題何在呢?

起初搜到,需要在連接時指定為utf8mb4才可以

mysql --default-character-set=utf8mb4 -u root -h xxx.xxx.xx.xx -p密碼

但還是不行...

最后發(fā)現(xiàn)執(zhí)行 SET NAMES utf8mb4 后再執(zhí)行更新語句,成功!

根據(jù)報錯信息,看起來在嘗試更新 xxxxx 表中的 xxxxxxx 字段時遇到了錯誤。報錯信息是 ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x93\xA3Ev...' for column 'xxxxxxx' at row 1 ,這表明在該字段中插入了無效的字符。

盡管您已經將該字段的字符集設置為 utf8mb4 ,支持存儲四字節(jié)的UTF-8字符,但有可能連接或會話的字符集設置仍然不兼容。為了確保字符集一致,您可以嘗試執(zhí)行以下操作:

  1. 在更新語句之前,執(zhí)行以下SQL語句設置會話字符集為 utf8mb4
SET NAMES utf8mb4;
  1. 然后,再執(zhí)行更新語句:
UPDATE `xxxxx` SET `xxxxxxx` = '...' WHERE (`id` = 5136);

通過這樣的設置,會話的字符集將與字段的字符集一致,可以正常存儲包含四字節(jié)UTF-8字符的字符串。

如果問題仍然存在,請確保數(shù)據(jù)庫連接和客戶端工具的字符集設置與字段的字符集設置一致。另外,您還可以檢查MySQL服務器的全局字符集設置,以確保它也是 utf8mb4 。

SET NAMES utf8mb4什么?

"SET NAMES utf8mb4" 是一個MySQL命令,用于設置數(shù)據(jù)庫連接的字符集編碼為utf8mb4。在MySQL中,字符集決定了數(shù)據(jù)庫如何存儲和處理數(shù)據(jù)。

utf8mb4是一種字符集編碼,支持Unicode字符集的全部字符,包括一些較早版本的utf8字符集無法表示的一些字符。utf8mb4編碼可以處理各種語言的文字和符號,包括一些較為特殊的字符,如表情符號和特殊符號等。

通過將數(shù)據(jù)庫連接的字符集編碼設置為utf8mb4,可以確保數(shù)據(jù)庫可以正確地存儲、檢索和顯示各種字符,避免出現(xiàn)亂碼或字符丟失的問題。這在處理多語言或包含特殊字符的應用程序中特別重要。

只對當前連接有效嗎?

是的,"SET NAMES utf8mb4" 命令只對當前數(shù)據(jù)庫連接有效。這意味著只有在執(zhí)行該命令后建立的數(shù)據(jù)庫連接會使用 utf8mb4 字符集編碼。

如果你在程序中使用了多個數(shù)據(jù)庫連接,每個連接都需要單獨執(zhí)行 "SET NAMES utf8mb4" 命令來設置字符集編碼。

另外,如果你希望永久地將數(shù)據(jù)庫的字符集編碼設置為 utf8mb4,你需要修改數(shù)據(jù)庫的默認字符集配置。這樣,在新建的數(shù)據(jù)庫連接中不需要再手動執(zhí)行 "SET NAMES utf8mb4" 命令,因為連接會默認使用數(shù)據(jù)庫的字符集配置。請注意,在修改數(shù)據(jù)庫的默認字符集之前,請確保備份數(shù)據(jù)和相應的預防措施。

結論

可能是:數(shù)據(jù)庫是utf8,即便我在連接時指定 --default-character-set=utf8mb4 ,依然會用utf8,必須要通過 SET NAMES utf8mb4 再設置一次

為了驗證,通過 mysql --default-character-set=utf8mb4 -u root -h xxx.xxx.xx.xx -p密碼 連接mysql,select 剛才更新成功的那條記錄,發(fā)現(xiàn)emoj無法正常顯示; 執(zhí)行 SET NAMES utf8mb4 后,再select能正??吹絜moj

設置mysql數(shù)據(jù)庫的字符集和編碼設置(謹慎操作,一般不要亂改)

要設置 MySQL 數(shù)據(jù)庫的字符集和編碼設置,你可以采取以下步驟:

  1. 登錄到 MySQL 數(shù)據(jù)庫服務器,可以使用以下命令: mysql -u your_username -p 替換 your_username 為你的數(shù)據(jù)庫用戶名。

在登錄后,可以執(zhí)行以下命令來查看當前的字符集和編碼設置:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

這將顯示當前的字符集和編碼設置。

  1. 若要修改數(shù)據(jù)庫的字符集和編碼設置,可以執(zhí)行以下命令(以utf8mb4為例):

    ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    替換 your_database_name 為你要修改的數(shù)據(jù)庫名稱。

如果需要修改特定表的字符集和編碼設置,可以執(zhí)行以下命令(以utf8mb4為例):

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

替換 your_table_name 為你要修改的表名稱。

如果你希望新創(chuàng)建的表默認采用特定的字符集和編碼,可以在創(chuàng)建表時指定:

CREATE TABLE your_table_name (
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

替換 your_table_name 為你要創(chuàng)建的表名稱,并根據(jù)需要修改其他表的列和選項。

  1. 重啟 MySQL 服務以使更改生效,具體的重啟方式取決于你的操作系統(tǒng)和安裝方式。

請注意,修改字符集和編碼設置可能會影響現(xiàn)有數(shù)據(jù)和應用程序,因此在進行任何更改之前,請確保備份數(shù)據(jù)庫并謹慎操作。

如何 修改數(shù)據(jù)庫的默認字符集配置

要修改數(shù)據(jù)庫的默認字符集配置,你需要執(zhí)行以下步驟:

  1. 登錄到你的MySQL數(shù)據(jù)庫服務器。
  2. 執(zhí)行以下命令來打開MySQL的配置文件(通常是my.cnf或my.ini): sudo nano /etc/mysql/my.cnf 如果你使用的是Windows系統(tǒng),則路徑可能是 C:\ProgramData\MySQL\MySQL Server X.X\my.ini ,其中X.X代表你的MySQL版本號。
  3. 在配置文件中找到 [mysqld] 部分。
  4. 添加或修改以下兩行來設置默認字符集編碼為 utf8mb4: [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci 上述配置將字符集設置為 utf8mb4,同時使用了 utf8mb4_unicode_ci 校對規(guī)則。你也可以選擇其他適合你的校對規(guī)則。
  5. 保存并關閉配置文件。
  6. 重新啟動MySQL服務以使配置生效,可以使用適合你的操作系統(tǒng)的命令,例如:
    • 在Linux上使用: sudo systemctl restart mysql
    • 在Windows上使用: net stop MySQL net start MySQL
  7. 現(xiàn)在,新建的數(shù)據(jù)庫連接將默認使用 utf8mb4 字符集編碼。

請注意,修改數(shù)據(jù)庫的默認字符集可能會對現(xiàn)有的數(shù)據(jù)庫和數(shù)據(jù)產生影響。在執(zhí)行這些步驟之前,請確保備份數(shù)據(jù)并采取相應的預防措施。

以上就是詳解MySQL中的字符集和排序規(guī)則的詳細內容,更多關于MySQL字符集和排序規(guī)則的資料請關注腳本之家其它相關文章!

相關文章

  • mysql實用操作之日期格式化例子

    mysql實用操作之日期格式化例子

    這篇文章主要給大家介紹了關于mysql實用操作之日期格式化的相關資料,DATE_FORMAT()函數(shù)用于格式化MySQL中的日期和時間字段,支持多種格式化選項,需要的朋友可以參考下
    2024-11-11
  • 眼見不一定為實之MySQL中的不可見字符詳解

    眼見不一定為實之MySQL中的不可見字符詳解

    這篇文章主要給大家介紹了關于眼見不一定為實之MySQL中不可見字符的相關資料,不可見字符是指在文本中無法直接顯示出來的字符,它們通常用于控制文本的格式或布局,需要的朋友可以參考下
    2024-06-06
  • 一文帶你理解MySql中explain結果filtered

    一文帶你理解MySql中explain結果filtered

    使用EXPLAIN關鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的,下面這篇文章主要給大家介紹了關于MySql中explain結果filtered的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • MySQL查詢語句簡單操作示例

    MySQL查詢語句簡單操作示例

    這篇文章主要介紹了MySQL查詢語句簡單操作,結合實例形式分析了MySQL數(shù)據(jù)庫、數(shù)據(jù)表創(chuàng)建、數(shù)據(jù)插入、數(shù)據(jù)查詢等相關操作技巧,需要的朋友可以參考下
    2019-11-11
  • MySQL中的DELETE刪除數(shù)據(jù)及注意事項

    MySQL中的DELETE刪除數(shù)據(jù)及注意事項

    MySQL的DELETE語句是數(shù)據(jù)庫操作中不可或缺的一部分,通過合理使用索引、批量刪除、避免全表刪除、使用TRUNCATE、使用ORDER BY和LIMIT以及優(yōu)化事務,可以顯著提高DELETE語句的執(zhí)行效率,這篇文章介紹MySQL的DELETE刪除數(shù)據(jù)詳解,感興趣的朋友一起看看吧
    2025-11-11
  • mysql 8.0.11 壓縮包版安裝配置方法圖文教程

    mysql 8.0.11 壓縮包版安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.11 壓縮包版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析

    MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析

    這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析,并通過實例給大家例句的問題處理辦法,需要的朋友參考學習下。
    2017-12-12
  • mysql重置root密碼的完整步驟(適用于5.7和8.0)

    mysql重置root密碼的完整步驟(適用于5.7和8.0)

    這篇文章主要介紹了mysql重置root密碼的完整步驟,文中描述了如何停止MySQL服務、以管理員身份打開命令行、替換配置文件路徑、修改密碼以及重新啟動MySQL服務的過程,需要的朋友可以參考下
    2025-01-01
  • 深入理解MySQL雙字段分區(qū)(OVER(PARTITION BY A,B)

    深入理解MySQL雙字段分區(qū)(OVER(PARTITION BY A,B)

    本文主要介紹了MySQL中的窗口函數(shù)雙字段分區(qū)功能(OVER(PARTITION BY A,B),分析其在數(shù)據(jù)分組和性能優(yōu)化中的應用,提高查詢效率,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • MySQL 問題匯總及常見解決方式

    MySQL 問題匯總及常見解決方式

    文章總結了MySQL使用中常見的問題及解決方案,包括連接與訪問問題、性能優(yōu)化、數(shù)據(jù)操作與語法問題、服務與配置問題和存儲引擎相關問題,主要建議先查日志定位問題,日常做好配置優(yōu)化和備份,遇到復雜問題結合工具進行分析,感興趣的朋友跟隨小編一起看看吧
    2017-09-09

最新評論

平塘县| 万全县| 淳化县| 左云县| 河西区| 青田县| 镇安县| 兴海县| 醴陵市| 大姚县| 鹿泉市| 瑞安市| 姚安县| 略阳县| 潍坊市| 中山市| 迭部县| 从江县| 元江| 广灵县| 扶余县| 饶河县| 伊春市| 高碑店市| 克什克腾旗| 台东县| 桑日县| 洛浦县| 壤塘县| 南乐县| 盘锦市| 遵化市| 资中县| 乌兰察布市| 郸城县| 铜鼓县| 辉南县| 万源市| 普陀区| 温宿县| 渑池县|