Khoảng trắng trong MySQL ở đâu?

Tại nơi làm việc, chúng tôi đã gặp phải một lỗi cho phép bất kỳ người dùng nào đăng nhập thành công nếu tham số [. user_session][. tên người dùng] chứa khoảng trắng ở cuối. Điều đó có nghĩa là, nếu tên người dùng của tôi là “hstevens”, tôi có thể đăng nhập hiệu quả với tên /hstevens\s*/. Mã đã chọn người dùng hiện tại cho phiên bằng cách

@login_user = User.find_by(name: params[:user_session][:username])

Thật thú vị, đây là một đoạn nhật ký. Lưu ý rằng truy vấn chứa khoảng trắng ở cuối và tôi vẫn có thể đăng nhập

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '

Tất nhiên, Stack Overflow đã có câu trả lời. Đây là TL; DR

  • SELECT “this” = “this” trả về TRUE
  • SELECT “this” LIKE “this” trả về FALSE

Theo mặc định, phương pháp #find_by sử dụng = khi so sánh hai bản ghi. Tương tự như tạo phạm vi tùy chỉnh, tôi chỉ cần thay thế tham số băm bằng một chuỗi chứa một số SQL;

@login_user = User.where("name LIKE ?", params[:user_session][:username]).first@login_user.to_sql# => SELECT `users`.* FROM `users` WHERE `users.name` LIKE 'hstevens ' LIMIT 1

Từ những gì tôi thu thập được trên mạng, đây có vẻ là một “tính năng” trong MySQL. Một số đã khuyến nghị sử dụng chức năng để xóa khoảng trắng trong khi truy vấn. Liên quan đến các lĩnh vực nhạy cảm như thông tin đăng nhập hoặc mật khẩu, tôi cảm thấy rằng đây là một thông lệ kém. Đặc biệt với các trường đăng nhập, việc xác thực rất quan trọng để tăng tính bảo mật và thúc đẩy một định dạng nhất định cho các bản ghi cơ sở dữ liệu. Tại sao bạn nên làm bẩn biểu mẫu do người dùng gửi chỉ để bỏ qua xác thực


Description:
When MySQL converts JSON to a string it apparently gives no control over the default formatting.

This has two immediate and very obvious effects:

1. The default output includes whitespace which is unnecessary and which may reduce performance.
2. The inclusion of whitespace in the output significantly increases the proportion of cases in which serialized JSON strings from MySQL for the same data will differ from serialised strings from other sources.

Most sources will serialize JSON by default as efficiently as possible so will not include whitespace. Those with specific peculiarities tend to take flags to 

There are many cases where two implementations cannot be relied upon to serialize structures to identical strings, for example, object key order, large string handling, escaping of non-ascii, etc. Generally however there are cases that are usually safe, for example:

For [0, 1, 2, 3] virtually all common and basic platform implementations can be relied upon to produce [0,1,2,3] where as MySQL will product [0, 1, 2, 3]. Some deduplication mechanisms may want to rely on traditionally safes cases but would not be able to.

Efficiency speaks for itself, for the ability to match identical documents based on serialized form, removing spaces would not be intended to exhaustively solve that problem.

How to repeat:
Any SQL that causes JSON to be converted to string.

Suggested fix:
Add options to control the format of JSON output, specifically to not include any excessive whitespace.


Description:
Trailing white spaces are ignored in where clause comparison when using EQUALS.

How to repeat:
select 'x' = 'x'; -- 1 
select 'x' like 'x'; -- 1

// ignores trailing white spaces. 'x' is certainly different from 'x  '.
select 'x' = 'x    '; -- 1 
select 'x' like 'x    '; -- 0

Cơ sở dữ liệu của chúng tôi có một bảng tên là customer_information với dữ liệu trong các cột id,

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
0,
User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
1 và
User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
2. Các địa chỉ email đã được người dùng điền theo cách thủ công và một số đã vô tình nhập vào khoảng trắng không cần thiết. Bạn muốn xóa khoảng trắng khỏi địa chỉ email

idfirst_namelast_nameemail_address1CalvinRiosrios. ví dụ calvin. com2AlanPatersonal và. paterson@ ví dụ. com3KurtEvanskurt. evans@ví dụ. com4AlexWatkinsalex. watkins@ví dụ. com

Dung dịch

Chúng ta sẽ sử dụng hàm

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
3. Đây là truy vấn

	SELECT
		first_name,
		last_name,
		REPLACE(email_address, " ", "") AS correct_email_address
	FROM customer_information;

Đây là kết quả của truy vấn

first_namelast_nameemail_addressCalvinRiosrios. ví dụ calvin. comAlanPatersonalan. paterson@ví dụ. comKurtEvanskurt. evans@ví dụ. comAlexWatkinsalex. watkins@ví dụ. com

Thảo luận

Sử dụng hàm

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
3 nếu bạn muốn thay thế tất cả các lần xuất hiện của một chuỗi con trong một chuỗi đã cho. Trong ví dụ của chúng tôi, chúng tôi thay thế các khoảng trống không cần thiết bằng các giá trị trống

Hàm này có ba đối số. Sau đây minh họa cú pháp của hàm

REPLACE(string_expression, substring, new_substring)

Đối số đầu tiên là chuỗi chúng tôi muốn sửa đổi. Đối số thứ hai là chuỗi con được thay thế và đối số thứ ba là chuỗi chúng tôi muốn sử dụng thay cho chuỗi con được thay thế. Chúng tôi loại bỏ các khoảng trắng không mong muốn trong ví dụ của mình, nhưng chức năng này có thể được sử dụng cho nhiều mục đích. Chẳng hạn, chúng ta có thể muốn làm sạch và chuẩn hóa một cột số điện thoại. Chúng ta có thể sử dụng hàm

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
3 để làm như vậy

Nếu bạn muốn xóa nhiều ký tự khỏi một chuỗi nhất định, chỉ cần lồng hàm

User Load (48.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hstevens ' LIMIT 1 [["name", "hstevens "]] # .. [2015-09-10 10:40:49] Successfully logged in as user 'hstevens '
3 lần thứ hai. Ví dụ: nếu bạn có một chuỗi có dấu cách và dấu gạch ngang không cần thiết, bạn có thể sử dụng cú pháp sau

	REPLACE(REPLACE(string_expression, " ", ""), "-", "")

Hãy nhớ rằng các đối số của hàm này trong MySQL phân biệt chữ hoa chữ thường, vì vậy hãy cẩn thận với các chữ cái

Làm cách nào để tìm khoảng trắng trong MySQL?

hàm SPACE() .

Làm cách nào để thêm khoảng trắng trong MySQL?

Có thể bạn cần đệm một chuỗi bằng cách thêm khoảng trắng ở đầu hoặc cuối. Hoặc có thể bạn cần thay thế một khoảng trắng trong chuỗi bằng nhiều khoảng trắng. Dù bằng cách nào, MySQL có chức năng SPACE() để giúp bạn. Hàm SPACE() là một cách dễ dàng để bạn trả lại bao nhiêu ký tự khoảng trắng mà bạn cần

Làm cách nào để xóa khoảng trắng trong MySQL?

Để xóa khoảng trắng ở đầu và cuối, chúng ta có thể sử dụng lệnh trim() trong MySQL.

Làm thế nào để sử dụng không gian trong MySQL?

Hàm SPACE() trong MySQL . Nó trả về chuỗi chứa khoảng cách số được chỉ định . Ví dụ 1. SPACE() Hàm trả về chuỗi chỉ chứa khoảng trắng. Ví dụ-2. Áp dụng Hàm SPACE() với CONCAT() Hàm trả về một chuỗi.