MySQL - ความยาว () กับ char_length ()


215

ความแตกต่างหลักระหว่างlength()และchar_length()คืออะไร

ฉันเชื่อว่ามันมีบางอย่างที่เกี่ยวข้องกับสตริงไบนารี่และสตริง มีเหตุผลจริงหรือไม่ที่จะเก็บสตริงเป็นไบนารี่?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
ใช่มีเหตุผลเชิงปฏิบัติในการจัดเก็บสตริงไบนารีเมื่อพวกเขาเป็นสตริงไบนารีจริงเช่นการบีบอัด
sanmai

คำตอบ:


351

LENGTH()ส่งกลับความยาวของสตริงวัดไบต์
CHAR_LENGTH()ส่งกลับความยาวของสตริงวัดในตัวละคร

สิ่งนี้เกี่ยวข้องอย่างยิ่งสำหรับ Unicode ซึ่งอักขระส่วนใหญ่เข้ารหัสในสองไบต์ หรือ UTF-8 โดยที่จำนวนไบต์แตกต่างกันไป ตัวอย่างเช่น:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

อย่างที่คุณเห็นว่าสัญญาณยูโรนั้นมีขนาด 3 ไบต์ (มันเข้ารหัสเหมือน0xE282ACUTF-8) ถึงแม้ว่ามันจะเป็นเพียงตัวละครตัวเดียวเท่านั้น


6
UCS-2 เท่านั้นที่ถูกเข้ารหัสในสองไบต์ต่อตัวอักษร การเข้ารหัส (หรือแม่นยำกว่า UTF-16LE) นี้เป็นสิ่งที่ Windows เรียกว่า“ Unicode” ที่ทำให้เข้าใจผิด MySQL ไม่รองรับ UTF-16 แทนที่จะใช้วิธีปกติในการใส่สายอักขระ Unicode ลงในนั้นคือใช้ UTF-8
bobince

2
ตัวอย่างเช่น: select length ('日本語'), char_length ('日本語');
sanmai

@bobince: แม้ UCS 2 เข้ารหัสอักขระบางตัวในกว่า 2 0313 combining comma aboveไบต์ตัวอย่างเช่น เนื่องจาก a = 61, 0x00610313 แสดงเป็นa̓และใช้เวลานานถึง 4 ไบต์
Andomar

2
ในความเป็นจริงแล้วคำศัพท์ Unicode นั้นยังคงเป็นอักขระ 2 ตัวแม้ว่าจะมีเครื่องหมายรวมกันทั้งหมด - หากใช้แบบอักษรที่เหมาะสม - แสดงเป็นรูปสัญลักษณ์เดียว UTF-16LE ยังสามารถมีตัวอักษรขนาด 4 ไบต์ได้แม้ว่าต้องขอบคุณตัวแทน
bobince

6
ดังนั้นฉันควรใช้ฟังก์ชันใดในการหาวิธีปรับขนาดคอลัมน์ VARCHAR ของฉัน เมื่อสร้างตารางสมมติว่าหนึ่งคอลัมน์คือ VARCHAR (10) จะอนุญาตให้มีอักขระได้สูงสุด 10 ตัวหรือสูงสุด 10 ไบต์หรือไม่
still_dreaming_1

19

varchar (10) จะเก็บอักขระ 10 ตัวซึ่งอาจมากกว่า 10 ไบต์ ในดัชนีมันจะจัดสรรความยาวสูงสุดของฟิลด์ - ดังนั้นหากคุณใช้ UTF8-mb4 มันจะจัดสรร 40 ไบต์สำหรับฟิลด์ 10 อักขระ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.