這很奇怪。根據 MySQL 開發人員網站 -
MySQL CHAR_LENGTH(str)
回傳字串 str 的長度,以字符為單位。多位元組字符算作單個字符。這意味著對于包含五個 2 位元組字符的字串,LENGTH() 回傳 10,而 CHAR_LENGTH() 回傳 5。
這顯然意味著 CHAR_LENGTH(str) 的輸出與字符集無關。
現在如-
字串文字字符集和整理
我可以使用介紹人來設定字串的字符集,如 -
選擇'abc';
選擇 _latin1'abc';
選擇 _binary'abc';
選擇 _utf8mb4'abc' 整理 utf8mb4_danish_ci;
就我而言,我采用字串文字“Hello”,使用介紹器設定它的 CHARACTER SET,并將其用作 MySQL CHAR_LENGTH(str) 函式的引數。但奇怪的是,當使用不同的字符集時,它有時會產生不同的輸出。例子 -
SELECT CHAR_LENGTH(_utf8mb4"Hello") AS character_length;
------------------
| character_length |
------------------
| 5 |
------------------
SELECT CHAR_LENGTH(_latin1"Hello") AS character_length;
------------------
| character_length |
------------------
| 5 |
------------------
SELECT CHAR_LENGTH(_ucs2"Hello") AS character_length;
------------------
| character_length |
------------------
| 3 |
------------------
這里,“Hello”有 5 個字符。CHARACTER SETS _utf8mb4 和 _latin1 正確顯示字符數。但是 CHARACTER SET _ucs2 奇怪地將數字 0f 字符顯示為 3。
這是怎么回事?
uj5u.com熱心網友回復:
那是因為所顯示的語言,該詞需要 3 個字符。
擴展我的回答。
字符轉換在最好的情況下是困難的,應該不惜一切代價避免。
首先,MySQL 嘗試將 $ Byte characte4r 轉換為 ucs2 具有的 2 Byte 字符。
然后使用生成的位元組顯示字符,即您在代碼段末尾看到的內容。
因此,在字符集的轉換中,您沒有像計算機科學位元組中隨處可見的字母,其表示形式為 H,但另一個字符集中的位元組可能具有另一種表示形式。此外,如果位元組數不同,您總是需要一些規則,如何將一個字符集轉換為另一個字符集。
所以我還擴展了這個例子,向你展示確定性轉換確實發生了,如果你查看位元組或二進制表示,你會發現使用的具體演算法。
SELECT CHAR_LENGTH(_ucs2"Hello") AS character_length;| 字符長度| | ---------------: | | 3 |
SELECT _ucs2"Hello";| ?汬 | | :------ | | H敬汯 |
SELECT _ucs2"Hel";| ? | | :--- | | 敬|
SELECT _ucs2"Hell";| ?汬 | | :----- | | ?汬 |
SELECT _ucs2"Hellos";| ?汬潳 | | :-------- | | ?汬潳 |
db<>在這里小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342398.html
下一篇:MySQL觸發器是要走的路嗎?
